Cod sursa(job #7296)

Utilizator snaked31Stanica Andrei snaked31 Data 21 ianuarie 2007 13:21:46
Problema Elimin Scor 30
Compilator cpp Status done
Runda preONI 2007, Runda 1, Clasa a 10-a Marime 2.14 kb
#include <stdio.h>

#define nm 500
#define INF 200000000

int n, m, r, c, i, j, sol;
int v[nm][nm], si[nm], sj[nm], vizi[nm], vizj[nm], min, mi, mj;

void read()

{
	scanf("%d %d %d %d", &n, &m, &r, &c);

    for (i=1; i<=n; i++)
    {
    	for (j=1; j<=m; j++)
        {
        	scanf("%d", &v[i][j]);
            sol += v[i][j];
            si[i] += v[i][j];
            sj[j] += v[i][j];
        }
    }
}


void solve()


{
    while (r != 0 && c != 0)
    {
    	min = INF;
        for (i=1; i<=n; i++)
        {
            if (vizi[i] == 0)
        	for (j=1; j<=m; j++)
            {
                if (min > si[i] + sj[j] - v[i][j] && vizj[j] == 0)
                {
                	min = si[i] + sj[j] - v[i][j];
                    mi = i;
                    mj = j;
                }
            }
        }

        r --;
        c --;
        sol -= min;

        vizi[mi] = 1;
        vizj[mj] = 1;

        for (i=1; i<=n; i++)
        {
            si[i] -= v[i][mj];
        }
        for (j=1; j<=m; j++)
        	sj[j] -= v[mi][j];
    }
    while (r != 0)
    {
        min = INF;
        for (i=1; i<=n; i++)
        {
            if (vizi[i] == 0)
                if (min > si[i])
                {
                	min = si[i];
                    mi = i;
                }
        }

        r --;
        sol -= min;

        vizi[mi] = 1;

        for (j=1; j<=m; j++)
        	sj[j] -= v[mi][j];
    }
    while (c != 0)
    {
        min = INF;
        	for (j=1; j<=m; j++)
            {
                if (min > sj[j] && vizj[j] == 0)
                {
                	min = sj[j] - v[i][j];
                    mj = j;
                }
            }

        c --;
        sol -= min;

        vizj[mj] = 1;

        for (i=1; i<=n; i++)
        {
            si[i] -= v[i][mj];
        }
    }
}


void write()

{
	printf("%d\n", sol);
}


int main()

{
	freopen("elimin.in", "r", stdin);
    freopen("elimin.out","w",stdout);

    read();
    solve();
    write();

    fclose(stdin);
    fclose(stdout);

	return 0;
}