Cod sursa(job #994990)

Utilizator ludacrivasilii teodorovici ludacri Data 6 septembrie 2013 22:05:51
Problema Elimin Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream f("elimin.in");
ofstream g("elimin.out");
short int a[700][700];
int n,m,r,c,sl[7300],sc[7300],suml[7300],sumc[7300],sumtot,sol,mx=-2147000000,nbit=0;
int e[20];
void Read()
{ int i,j;
    f>>n>>m>>r>>c;
  if (n<=m)
     for(i=1;i<=n;i++)
     for(j=1;j<=m;j++)
     f>>a[i][j];
    else
    { for(i=1;i<=n;i++)
      for(j=1;j<=m;j++)
      f>>a[j][i];
      swap(n,m);
      swap(r,c);
    }
      for(i=1;i<=n;i++)
      for(j=1;j<=m;j++)
       {sl[i]+=a[i][j];
       sc[j]+=a[i][j];
       sumtot+=a[i][j];
       }
}
 
void PrelSol()
{ int i,col;
    sol=sumtot;
    for(i=1;i<=m;i++) sumc[i]=sc[i];
 
    for(i=1;i<=r;i++)
       {for(col=1;col<=m;col++)
         sumc[col]-=a[e[i]][col];
         sol-=sl[e[i]];
       }
     if (c)
     { nth_element(sumc+1,sumc+c+1,sumc+m+1);
       for(col=1;col<=c;col++) sol-=sumc[col]; }
    if (sol>mx) mx=sol;
}
 
void Back(int k)
{ int i;
if (k>r) PrelSol();
else
 for(i=e[k-1]+1;i<=n;i++)
    { e[k]=i; Back(k+1);}
}
int main()
{ Read();
  e[0]=0;
  Back(1);
  g<<mx;
    return 0;
}