Cod sursa(job #2415455)

Utilizator usureluflorianUsurelu Florian-Robert usureluflorian Data 26 aprilie 2019 00:03:47
Problema Elimin Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f ("elimin.in");
ofstream g ("elimin.out");
const int nmax=1e3+3;
int n,m,t1,t2,usu,v[nmax][nmax],t22[nmax],aux[nmax][nmax],pwp,viz[nmax],sol,s[nmax],t[nmax];
vector <int> d;
void bulan()
{
    int usu2=usu;
    for(int i=1;i<=n;++i) t22[i]=t[i];
    sort(t22+1,t22+n+1);
    for(int i=1;i<=t1;++i)
    {
        usu2-=t22[i];
        if(usu2<sol) return;
    }
    sol=max(sol,usu2);
}
void solve(int lvl,int act)
{
    if(lvl==t2)
    {
        bulan();
        return;
    }
    for(int i=act;i<=m;++i)
    {
        viz[i]=1;
        d.push_back(i);
        usu-=s[i];
        for(int j=1;j<=n;++j) t[j]-=v[j][i];
        solve(lvl+1,i+1);
        viz[i]=0;
        d.pop_back();
        usu+=s[i];
        for(int j=1;j<=n;++j) t[j]+=v[j][i];
    }
}
int main()
{
    ios::sync_with_stdio(false);
    f>>n>>m>>t1>>t2;
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=m;++j) f>>v[i][j];
    }
    if(m>n)
    {
        swap(t1,t2);
        for(int i=1;i<=m;++i)
        {
            for(int j=1;j<=n;++j) aux[i][j]=v[j][m-i+1];
        }
        for(int i=1;i<=m;++i)
        {
            for(int j=1;j<=n;++j) v[i][j]=aux[i][j];
        }
        swap(n,m);
    }
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=m;++j) t[i]+=v[i][j];
    }
    for(int i=1;i<=m;++i)
    {
        for(int j=1;j<=n;++j)
        {
            pwp+=v[j][i];
            s[i]+=v[j][i];
        }
    }
    usu=pwp;
    solve(0,1);
    g<<sol;
    return 0;
}