Cod sursa(job #1724512)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 3 iulie 2016 13:44:35
Problema Elimin Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define MAXN 7294
#define INF 1000000000
using namespace std;
vector <int> mat[MAXN+1];
int vf[MAXN+1];
int sum[MAXN+1];
int main(){
   FILE*fi,*fout;
   int i,j,n,m,l,c,s,s1,maxim,p2,x,con;
   fi=fopen("elimin.in" ,"r");
   fout=fopen("elimin.out" ,"w");
   fscanf(fi,"%d%d%d%d" ,&n,&m,&l,&c);
   s=0;
   for(i=1;i<=n;i++){
    mat[i].push_back(0);
    for(j=1;j<=m;j++){
       fscanf(fi,"%d" ,&x);
       mat[i].push_back(x);
       s+=mat[i][j];
    }
  }
   maxim=0;
   if(n<=m){
      for(p2=0;p2<(1<<n);p2++){
         con=0;
         x=p2;
         s1=0;
         for(j=1;j<=n;j++){
            if(x&1){
               con++;
               vf[j]=1;
               for(i=1;i<=m;i++)
                 s1+=mat[j][i];
            }
            x>>=1;
         }
         if(con==l){
            for(i=1;i<=m;i++){
               sum[i]=0;
               for(j=1;j<=n;j++)
                if(vf[j]==0)
                 sum[i]+=mat[j][i];
            }
            std::sort(sum+1,sum+m+1);
            for(i=1;i<=c;i++)
              s1+=sum[i];
            if(s-s1>maxim)
              maxim=s-s1;
         }
         memset(vf,0,sizeof(vf));
      }
   }
   else{
       for(p2=0;p2<(1<<m);p2++){
         con=0;
         x=p2;
         s1=0;
         for(j=1;j<=m;j++){
            if(x&1){
               con++;
               vf[j]=1;
               for(i=1;i<=n;i++)
                 s1+=mat[i][j];
            }
            x>>=1;
         }
         if(con==c){
            for(i=1;i<=n;i++){
               sum[i]=0;
               for(j=1;j<=m;j++)
                if(vf[j]==0)
                 sum[i]+=mat[i][j];
            }
            std::sort(sum+1,sum+n+1);
            for(i=1;i<=l;i++)
              s1+=sum[i];
            if(s-s1>maxim)
              maxim=s-s1;
         }
         memset(vf,0,sizeof(vf));
      }
   }
   fprintf(fout,"%d" ,maxim);
   fclose(fi);
   fclose(fout);
   return 0;
}