Pagini recente » Cod sursa (job #2133101) | Cod sursa (job #3195203) | Cod sursa (job #742378) | Cod sursa (job #2602623) | Cod sursa (job #7297)
Cod sursa(job #7297)
#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;
}