Cod sursa(job #2514955)

Utilizator lucianistratiIstrati Lucian lucianistrati Data 27 decembrie 2019 14:04:58
Problema Elimin Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.15 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("elimin.in");
ofstream fout("elimin.out");
int M, N, a[5000][20], R, C, rezultat, aux[5052], x[30];
void Citire()
{
    fin>>N>>M>>R>>C;//se citesc dimensiunile matricei si R,C, respectiv numarul de linii si de coloane ce trebuie sa fie eliminate
    if(M>N)
    {
        for(int i=1;i<=N;i++)
            for(int j=1;j<=M;j++)
                fin>>a[j][i];
        swap(M,N);
        swap(C,R);
    }
    else
    {
        for(int i=1;i<=N;i++)
            for(int j=1;j<=M;j++)
                fin>>a[i][j];
    }
    for(int i=1;i<=M;++i)
        for(int j=1;j<=N;++j)
        {
            a[j][0]+=a[j][i];//se retine in a[j][0] suma elementelor de pe linia j
        }
 
}
 
void Determina()
{
    int ok=0;
    for(int i=1;i<=N;++i)
    {
        aux[i]=a[i][0];//in vectorul aux se retine elementul a[i][0] care este calculata suma in functia Citire()
    }
    nth_element(aux+1,aux+R,aux+N+1);
    int nr=N-R;
    //sort(aux+1, aux+N+1);//vectorul de sume aux este sortat
    for(int i=1;i<=N && nr>0;i++)
    {
        if(aux[i]>aux[R])
        {
            ok+=aux[i];
            nr--;
        }
    }
    for(int i=1;i<=N && nr>0;i++)
    {
        if(aux[i]==aux[R])
        {
            ok+=aux[i];
            nr--;
        }
    }
    rezultat=max(ok,rezultat);//rezultatul e maximul intre ok si valoarea calculata precedent
}
void Backtracking(int k, int t)
{
    if(k>C)//daca k este mai mare decat numarul de coloane C ce trebuie sa fie eliminate
    {
        Determina();
    }
    else
    {
        for(int i=t+1;i<=M;++i)
        {
            x[k]=i;
            for(int j=1;j<=N;++j) a[j][0]-=a[j][i];// se scade in elementele de pe prima coloana
            Backtracking(k+1,i); //se reapeleza subprogramul Backtracking
            for(int j=1;j<=N;++j) a[j][0]+=a[j][i];//se aduna in elementele de pe rpima coloana
        }
    }
}
 
int main()
{
    Citire();//se citesc datele de intrare
    Backtracking(1, 0); //se apeleaza functia de backtracking
    fout<<rezultat;
    return 0;
}