Cod sursa(job #1134442)

Utilizator ArchazeyBaltatu Andrei-Mircea Archazey Data 6 martie 2014 15:58:09
Problema Jocul Flip Scor 30
Compilator cpp Status done
Runda boji_round6 Marime 2.5 kb
#include<iostream>
#include<fstream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#include<cstring>
#include<cstdlib>
using namespace std;

struct an
{
    int tip,indice;
};

ifstream fin("flip.in");
ofstream fout("flip.out");

int n,m,a[17][17];

inline void Citire()
{
    int i,j;
    fin>>n>>m;
    for (i=1;i<=n;i++)
        for (j=1;j<=m;j++)
            fin>>a[i][j];
}

inline an Analizeaza()
{
    int i,j,venituri,chieltuieli,linia,coloana,test,maxim;
    maxim=test=linia=coloana=0;
    an w;
    w.tip=0;w.indice=0;
    for (i=1;i<=n;i++)
        {
            venituri=chieltuieli=0;
            for (j=1;j<=m;j++)
                if (a[i][j]>=0)
                    chieltuieli+=a[i][j];
                else venituri+=a[i][j];
            venituri=abs(venituri);
            if (venituri>chieltuieli)
                if (venituri-chieltuieli>maxim)
                    {
                        maxim=venituri-chieltuieli;
                        test=1;
                        linia=i;
                    }
        }
    for (j=1;j<=m;j++)
            {
                venituri=chieltuieli=0;
                for (i=1;i<=n;i++)
                    if (a[i][j]>=0)
                        chieltuieli+=a[i][j];
                    else venituri+=a[i][j];
                venituri=abs(venituri);
                if (venituri>chieltuieli)
                    if (venituri-chieltuieli>maxim)
                        {
                            maxim=venituri-chieltuieli;
                            test=2;
                            coloana=j;
                        }
            }
    if (test==1)
        {
            w.tip=1;
            w.indice=linia;
        }
    else if (test==2)
        {
            w.tip=2;
            w.indice=coloana;
        }
    return w;
}

inline void Rezolva()
{
    int i,nr=0;
    an w;
    w=Analizeaza();
    while (w.tip!=0)
        {
          if (w.tip==1)
                for (i=1;i<=m;i++)
                    a[w.indice][i]=-a[w.indice][i];
          else if (w.tip==2)
                for (i=1;i<=n;i++)
                    a[i][w.indice]=-a[i][w.indice];
            w=Analizeaza();
            nr++;
        }
}

inline void Afisare()
{
    int i,j,suma=0;
    for (i=1;i<=n;i++)
        for (j=1;j<=m;j++)
            suma+=a[i][j];
    fout<<suma<<"\n";
}

int main()
{
    Citire();
    Rezolva();
    Afisare();
    return 0;
}