Cod sursa(job #2034945)

Utilizator ruxi.icleanuRuxandra Icleanu ruxi.icleanu Data 8 octombrie 2017 18:05:55
Problema Elimin Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <stdio.h>
#include <stdlib.h>
#include <cstring>
#include <algorithm>

using namespace std;

#define MAXN 7295
#define MAXM 15

int a[MAXN][MAXM], aux_a[MAXM][MAXN];
int sumlin[MAXM], scad[MAXM];

inline int nrbiti1(int x) {
    int nr=0;
    while(x>0) {
        x=x&(x-1);
        nr++;
    }
    return nr;
}

int main()
{
    int n, m, r, c, i, j, nr, lin, col, sum, maxs, aux;

    FILE *fi, *fo;
    fi = fopen("elimin.in", "r");
    fo = fopen("elimin.out", "w");

    fscanf(fi, "%d%d%d%d", &n, &m, &r, &c);
    if(n<m) {
        for(i=0; i<n; i++)
            for(j=0; j<m; j++)
                fscanf(fi, "%d", &aux_a[i][j]);
        aux=n;
        n=m;
        m=aux;
        for(i=0; i<n; i++)
            for(j=0; j<m; j++) {
                a[i][j]=aux_a[m-j-1][i];
                sumlin[i]+=a[i][j];
            }
        aux=r;
        r=c;
        c=aux;
    }
    else {
        for(i=0; i<n; i++)
            for(j=0; j<m; j++) {
                fscanf(fi, "%d", &a[i][j]);
                sumlin[i]+=a[i][j];
            }
    }

    nr=1<<m;
    maxs=-32000*7294;
    for(i=0; i<nr; i++)
        if(nrbiti1(i)==c) {
            memset(scad, 0, sizeof(scad));
            for(col=0; col<m; col++)
                if(i&(1<<col))
                    for(lin=0; lin<n; lin++)
                        scad[lin]+=a[lin][col];

            for(lin=0; lin<n; lin++)
                scad[lin]=sumlin[lin]-scad[lin];

            sort(scad, scad+n);
            sum=0;
            for(lin=r; lin<n; lin++)
                sum+=scad[lin];
            if(sum>maxs)
                maxs=sum;
        }
    fprintf(fo, "%d", maxs);
    fclose(fi);
    fclose(fo);
    return 0;
}