Cod sursa(job #1971874)

Utilizator TomaAlimosToma AlimoS TomaAlimos Data 21 aprilie 2017 10:44:54
Problema Jocul Flip Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include<fstream>
using namespace std;

fstream fin("flip.in",ios::in),fout("flip.out",ios::out);

struct for_flip
{
    long val;
    int pos;
    char LorC;
}f[33];

long a[17][17],S=0;
int n,m,nf;

void read(int nl, int nc)
{
    int i;
    int j;
    for(i=1;i<=nl;i++)
        for(j=1;j<=nc;j++)
            fin>>a[i][j];
}

int flip_go()
{
    long s;
    int i,j;
    nf=0;
    for(i=1;i<=n;i++)
    {
        s=0;
        for(j=1;j<=m;j++)
        {
            s+=a[i][j];
        }
        if(s<0)
        {
            nf++;
            f[nf].val=s;
            f[nf].pos=i;
            f[nf].LorC='L';
        }
    }
    for(j=1;j<=m;j++)
    {
        s=0;
        for(i=1;i<=n;i++)
        {
            s+=a[i][j];
        }
        if(s<0)
        {
            nf++;
            f[nf].val=s;
            f[nf].pos=j;
            f[nf].LorC='C';
        }
    }
    return nf;
}

int min_val(int nr)
{
    int i,min_pos=1;
    long m=f[1].val;
    for(i=2;i<=nr;i++)
    {
        if(f[i].val<m)
        {
            min_pos=i;
            m=f[i].val;
        }
    }
    return min_pos;
}

void flip(for_flip e)
{
    int i,j;
    if(e.LorC=='L')
        for(j=1;j<=m;j++)
            a[e.pos][j]*=(-1);
    else
        for(i=1;i<=n;i++)
            a[i][e.pos]*=(-1);
}
int sum()
{
    int i,j;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            S+=a[i][j];
    return S;
}

int main()
{
    fin>>n>>m;
    read(n,m);
    while(flip_go())
    {
        flip(f[min_val(nf)]);
    }
    fout<<sum();
    return 0;
}