Cod sursa(job #1105241)

Utilizator ion824Ion Ureche ion824 Data 11 februarie 2014 17:08:56
Problema Elimin Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 1.32 kb
#include<fstream>
#include<cstring>
#include<algorithm>
using namespace std;
const int Q = 751;
int N,M,R,C,a[Q][Q],s[Q],sc[Q],nr_biti[33000];
bool viz[Q];
 
int main(){
    ifstream fin("elimin.in");
    ofstream fout("elimin.out");
    int i,j,stot=0,sumsc=0,N2,x,p,k,sol=0;
    fin>>N>>M>>R>>C;
    if(M<=N)
      for(i=1;i<=N;++i)
        for(j=1;j<=M;++j)
        {
          fin>>a[i][j];
          sc[j]+=a[i][j];
        }
     else{
       for(i=1;i<=N;++i)
         for(j=1;j<=M;++j)
         {
           fin>>a[j][i];
           sc[i]+=a[j][i];  
         }
       swap(N,M);
       swap(R,C);   
          }     
    for(i=1;i<=M;++i)stot+=sc[i];
    N2=(1<<M);
    for(i=1;i<N2;++i)
    {
      nr_biti[i]=nr_biti[i>>1];
      if(i&1)++nr_biti[i];
    }
    for(i=0;i<N2;++i)
     if(nr_biti[i]==C)
     {
      x=i; p=1;
      while(x){ if(x&1)viz[p]=1; ++p; x>>=1; }
      for(j=1;j<=M;++j)
        if(!viz[j])
        {
         for(k=1;k<=N;++k)
           s[k]+=a[k][j];           
        }
      else sumsc+=sc[j];
      nth_element(s+1,s+R+1,s+N+1);
      for(j=1;j<=R;++j)sumsc+=s[j];
      if( stot-sumsc > sol )sol=stot-sumsc;
      memset(s,0,sizeof(s));
      memset(viz,0,sizeof(viz));
      sumsc=0;                      
     }
    fout<<sol;
     
 return 0;   
}