Cod sursa(job #34462)

Utilizator pitradaPit-Rada Ionel-Vasile pitrada Data 20 martie 2007 19:48:40
Problema Elimin Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include<fstream>
#include<stdlib.h>
using namespace std;
fstream fin,fout;
int M,N,R,C,a[7300],ok,LIN[7300],COL[7300],RR,CC,i,j,k,aux;
long smax,s;

long suma(void)
{
long s,i,j,k;
s=0;
for (i=0;i<RR;i++)
  for (j=0;j<CC;j++)
    {
    k=LIN[i]*N+COL[j]+1;
    s=s+a[k];
    }
return s;
}


int main(void)
{


fin.open("elimin.in",ios::in);
fout.open("elimin.out",ios::out);
fin>>M>>N>>R>>C;
for (i=0;i<M*N;i++) fin>>a[i];
for (i=0;i<M;i++)LIN[i]=i;
for (i=0;i<N;i++)COL[i]=i;

for (i=0;i<1000;i++)
   {
   j=floor(M*random());
   k=floor(M*random());
   aux=LIN[j];LIN[j]=LIN[k];LIN[k]=aux;
   j=floor(M*random());
   k=floor(M*random());
   aux=COL[j];COL[j]=COL[k];COL[k]=aux;
   }
RR=M-R; CC=N-C;
//suma initiala ramasa
smax=suma();
//incercam imbunatatiri
do {
   ok=1;//daca ramane ok egal cu 1 atunci ne oprim	
   //incercam sa schimbam 
   for (i=0;i<RR;i++)
      for (j=RR;j<M;j++)
           {
           aux=LIN[j]; LIN[j]=LIN[i]; LIN[i]=aux;
           s=suma();
           if (s<=smax)
              {aux=LIN[j]; LIN[j]=LIN[i]; LIN[i]=aux;} 
              else {smax=s; ok=0;}
           }
   for (i=0;i<CC;i++)
      for (j=CC;j<N;j++)
           {
           aux=COL[j]; COL[j]=COL[i]; COL[i]=aux;
           s=suma();
           if (s<=smax)
              {aux=COL[j]; COL[j]=COL[i]; COL[i]=aux;} 
              else {smax=s; ok=0;}
           }
   }
while (ok==0);
fout<<smax;
fin.close();
fout.close();
return 0;
}