Cod sursa(job #8318)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 24 ianuarie 2007 14:27:44
Problema Elimin Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.15 kb
#include <fstream.h>

ifstream f1("elimin.in");
ofstream f2("elimin.out");

int main(){
    int n,m,i,j,a[16][1000],r,c,q[16],nr,x[1000],poz,aux;
    long long l[16],p[1000],sum,s,min,s1[1000],max=0,mincp,minc;
    f1>>n;f1>>m;
    f1>>r>>c;
    if (n>m){
       aux=n;
       n=m;
       m=aux;
       sum=0;
       for (i=1;i<=m;i++){
           for (j=1;j<=n;j++){
               f1>>a[n-j+1][i];
               sum+=a[n-j+1][i];
           }
       }
    }
    else{
         sum=0;
         for (i=1;i<=n;i++){
             for (j=1;j<=m;j++){
                 f1>>a[i][j];
                 sum+=a[i][j];
             }
         }
    }
    min=sum;
    for (i=1;i<=n;i++){
        l[i]=0;
        for (j=1;j<=m;j++){
            l[i]+=a[i][j];
        }
    }
    for (j=1;j<=m;j++){
        p[j]=0;
        for (i=1;i<=n;i++){
            p[j]+=a[i][j];
        }
    }
    for (i=0;i<=n;i++)q[i]=0;
    max=0;
    while (q[0]==0){
          nr=0;
          for (i=1;i<=n;i++){
              if (q[i])nr++;
          }
          if (nr==r){
                     s=0;
                     for (i=1;i<=n;i++)if (q[i])s=s+l[i];
                     if (s<=min){
                                min=s;
                                for (j=1;j<=m;j++){
                                    s1[j]=0;
                                    for (i=1;i<=n;i++)if (q[i])s1[j]=s1[j]+a[i][j];
                                }
                                for (j=1;j<=m;j++)x[j]=1;
                                mincp=0;
                                for (i=1;i<=c;i++){
                                    minc=sum;
                                    for (j=1;j<=m;j++)if (x[j]&&p[j]-s1[j]<minc){minc=p[j]-s1[j];poz=j;}
                                    x[poz]=0;
                                    mincp+=minc;
                                }
                                if (sum-min-mincp>max)max=sum-min-mincp;
                     }
          }
          
          q[n]++;
          for (i=n;i>=1;i--)if (q[i]==2){q[i]=0;q[i-1]++;}
    }
    f2<<max<<'\n';
    
    f1.close();
    f2.close();
    return 0;
}