Cod sursa(job #729049)

Utilizator freakingVlad Eu freaking Data 29 martie 2012 10:59:27
Problema Elimin Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.32 kb
#include <utility>
#include <cstdio>
#define _in "elimin.in"
#define _out "elimin.out"
#define max(a,b) ((a>b) ? 1:2)
#define _nmax 7296
using namespace std;

int M,N,R,C;
long matr[_nmax][_nmax],S;
int minx=-1,miny=-1,pminx,pminy;


void s_x()
{
    int i;

    for(i=1;i<=N;i++)
    {
        matr[0][i]-=matr[pminx][i];
    }
    S-=matr[pminx][0];
    --R;
    matr[pminx][0]=-1;
}

void s_y()
{
    int i;

    for(i=1;i<=M;i++)
    {
        matr[i][0]-=matr[i][pminy];
    }
    S-=matr[0][pminy];
    --C;
    matr[0][miny]=-1;
}

void afla_y()
{
    int i,j,minloc,pminloc;
    miny=0;
    for(i=1;i<=M;i++)
    {
        minloc=-1;
        for(j=1;j<=N;j++)
        {
            if(matr[i][j]<minloc || minloc==-1)
            {
                minloc=matr[i][j];
                pminloc=j;
            }
        }
        if(++matr[N+1][pminloc]>miny)
        {
            pminy=i;
            miny=matr[N+1][pminloc];
        }

    }
}

void afla_x()
{
    minx=0;
    int j,i,minloc,pminloc,maxloc=0;
    for(j=1;j<=N;j++)
    {
        minloc=-1;
        for(i=1;i<=M;i++)
        {

            if(matr[i][j]<minloc || minloc ==-1)
            {
                minloc=matr[i][j];
                pminloc=i;
            }
        }

        if(++matr[pminloc][N+1]>minx)
            {
                pminx=pminloc;
                minx=matr[pminloc][N+1];
            }

    }
}

void conditii()
{
    int minabs;
    if(minx!=-1)
        if(miny!=-1)
        {
                minabs=max(minx,miny);
                switch(minabs)
                {
                    case 1: s_x();break;
                    case 2: s_y();
                }
        }
        else
            s_x();
    else
        s_y();
    minx=-1;
    miny=-1;
}



void citire()
{
    int i,j,val;
    scanf("%d %d %d %d",&M,&N,&R,&C);
    for(i=1;i<=M;i++)
    {
        for(j=1;j<=N;j++)
        {
            scanf("%d",&val);

            S+=val;
            matr[0][j]+=val;
            matr[i][0]+=val;
            matr[i][j] =val;
        }
    }
}

void rezolvare()
{
    int minabs;
    while(R!=0 || C!=0)
    {
        if(C)
            afla_y();
        if(R)
            afla_x();
        conditii();
    }
}

void afisare()
{
    printf("%ld",S);
}

int main()
{
    freopen(_in,"r",stdin);
    freopen(_out,"w",stdout);

    citire();
    rezolvare();
    afisare();

}