Cod sursa(job #7072)

Utilizator devilkindSavin Tiberiu devilkind Data 21 ianuarie 2007 12:18:59
Problema Elimin Scor 10
Compilator cpp Status done
Runda preONI 2007, Runda 1, Clasa a 9-a si gimnaziu Marime 1.21 kb
#include <stdio.h>
#include <stdlib.h>
#define NMAX 201

FILE *f = fopen("elimin.in","rt"), *g = fopen("elimin.out","wt");

int i,j,k,a[NMAX][NMAX],n,m,r,c,sc[NMAX],sl[NMAX],mc[NMAX],ml[NMAX],s,smax;
int mask[NMAX];

void citire()
{
fscanf(f,"%ld %ld %ld %ld",&n,&m,&r,&c);

for (i=1;i<=n;i++)
    for (j=1;j<=m;j++)
        {fscanf(f,"%ld",&a[i][j]);sl[i]+=a[i][j];sc[j]+=a[i][j];}
 
}

int cmp(const void *x, const void *y)
{return * (long int *) x - * (long int *) y;}

int next()
{
i=r;
while (mask[i]==n-r+i)
      i--;
if (i==0) return 1;
mask[i]++;
i++;
for (;i<=r;i++)
     mask[i]=mask[i-1]+1;
return 0;
}


void solve()
{long int gata=0;
for (i=1;i<=r;i++)
    mask[i]=i;
smax=0;
while (!gata)
      {
      for (i=1;i<=n;i++)
          ml[i]=sl[i];
      for (i=1;i<=n;i++)
          mc[i]=sc[i];
      for (i=1;i<=r;i++)
	  {ml[mask[i]]=0;
	  for (j=1;j<=m;j++)
	      mc[j]-=a[mask[i]][j];
          }
      qsort(mc,m+1,sizeof(int),cmp); 
      s=0;
      for (i=c+1;i<=m;i++)
          s+=mc[i];
      if (s>smax)
      	smax=s;
      gata=next();
      }  
fprintf(g,"%d",smax);
}

int main()
{
citire();
solve();
fclose(f);
fclose(g);
return 0;
}