Pagini recente » Cod sursa (job #2468397) | Cod sursa (job #1857949) | Cod sursa (job #1352037) | Cod sursa (job #1472032) | Cod sursa (job #6919)
Cod sursa(job #6919)
#include <stdio.h>
#include <stdlib.h>
FILE *f,*g;
int **a;
long **s,*sl,*sc;
int compare(const void *a,const void *b)
{
return (*(long*)a-*(long*)b);
}
int main()
{
int n,m,i,j,r,c,mini,minj;
long suma,min;
FILE *f=fopen("elimin.in","rt");
FILE *g=fopen("elimin.out","wt");
fscanf(f,"%d %d %d %d",&m,&n,&r,&c);
a=(int**)calloc(m,sizeof(int));
s=(long**)calloc(m,sizeof(long));
suma=0;
sl=(long*)calloc(m,sizeof(long));
sc=(long*)calloc(n,sizeof(long));
for (i=0;i<m;i++)
{
a[i]=(int*)calloc(n,sizeof(int));
s[i]=(long*)calloc(n,sizeof(long));
for (j=0;j<n;j++)
{
fscanf(f,"%d",&a[i][j]);
s[i][j]=-(long)a[i][j];
suma+=a[i][j];
sl[i]+=(long)a[i][j];
sc[j]+=(long)a[i][j];
}
}
if (r>0&&c>0)
{
while (r>0&&c>0)
{
i=0;
while (sl[i]<0&&i<m-1)
i++;
j=0;
while (s[j]<0&&j<n-1)
j++;
min=sl[i]+sc[j]-a[i][j];
mini=i;
minj=j;
for (i=0;i<m;i++)
for (j=0;j<n;j++)
if (sl[i]+sc[j]-a[i][j]<min&&sl[i]>0&&sc[j]>0)
{
min=sl[i]+sc[j]-a[i][j];
mini=i;
minj=j;
}
suma-=min;
sl[mini]=-1;
sc[minj]=-1;
for (i=0;i<m;i++)
sl[i]-=a[i][minj];
for (j=0;j<n;j++)
sc[j]-=a[mini][j];
r--;
c--;
}
}
i=0;
if (r>0)
qsort(sl,m,sizeof(long),compare);
while (r>0)
{
while (sl[i]<0)
i++;
suma-=sl[i];
i++;
r--;
}
j=0;
if (c>0)
qsort(sc,n,sizeof(long),compare);
while (c>0)
{
while (sc[j]<0)
j++;
suma-=sc[j];
j++;
c--;
}
fprintf(g,"%ld\n",suma);
fclose(f);
fclose(g);
return 0;
}