Cod sursa(job #2074564)

Utilizator tifui.alexandruTifui Ioan Alexandru tifui.alexandru Data 24 noiembrie 2017 19:33:55
Problema Elimin Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <bits/stdc++.h>
#define Nmax 8192
#define DIM 70000
using namespace std;
char buffer[DIM];
int poz=DIM-1;
void read(int &x)
{
    x=0;
    while(!isdigit(buffer[poz]))
        if(++poz==DIM)
        {
            poz=0;
            fread(buffer,1,DIM,stdin);
        }
    while(isdigit(buffer[poz]))
    {
        x=x*10+buffer[poz]-'0';
        if(++poz==DIM)
        {
            poz=0;
            fread(buffer,1,DIM,stdin);
        }
    }
}
int a[20][Nmax];
int sum[Nmax];
int val[Nmax];
int main()
{
    freopen("elimin.in","r",stdin);
    freopen("elimin.out","w",stdout);
    int n,m,R,C;
    read(n);
    read(m);
    read(R);
    read(C);
    if(n>m)
    {
        swap(n,m);
        swap(R,C);
        for(int j=1;j<=m;j++)
            for(int i=1;i<=n;i++)
                read(a[i][j]);
    }
    else
    {
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                read(a[i][j]);
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            sum[j]+=a[i][j];
    int nr,S,ans=-INT_MAX;
    for(int i=0;i<(1<<n);i++)
    {
        nr=0;
        for(int j=0;(1<<j)<=i;j++)
            if((1<<j)&i) nr++;
        if(nr!=R) continue;
        for(int j=1;j<=m;j++)
            val[j]=sum[j];
        for(int j=0;(1<<j)<=i;j++)
            if((1<<j)&i)
                for(int k=1;k<=m;k++)
                    val[k]-=a[j+1][k];
        sort(val+1,val+m+1);
        S=0;
        for(int j=C+1;j<=m;j++)
            S+=val[j];
        ans=max(ans,S);
    }
    printf("%d",ans);

    return 0;
}