Cod sursa(job #2922065)

Utilizator Bodo171Bogdan Pop Bodo171 Data 3 septembrie 2022 16:17:51
Problema Elimin Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <bits/stdc++.h>

using namespace std;
const int nmax = 7005;
int getLoss(vector< vector<int> > &mat, vector<int> &rows, int pos, int n, int m, int c){
    int totalLoss = 0;
    vector<int> losses(m);
    for(const auto &row: mat){
        for(int idx = 0; idx < m; idx++)
            losses[idx] += row[idx];
    }
    for(auto idx: rows)
        for(int jdx = 0; jdx < m; jdx++){
            totalLoss += mat[idx][jdx];
            losses[jdx] -= mat[idx][jdx];
        }
    sort(losses.begin(), losses.end());
    for(int idx = 0; idx < c; idx++)
        totalLoss += losses[idx];
    return totalLoss;

}
void tryCombinations(vector< vector<int> > &mat, vector<int> &state, int pos, int n, int m, int r, int c, int &ans){
    if(pos == r){
        ans = min(ans, getLoss(mat, state, pos, n, m, c));
        return;
    }
    int last = (pos == 0 ? 0 : state[pos - 1] + 1);
    for(int newElement = last; newElement < n; newElement++){
        state[pos] = newElement;
        tryCombinations(mat, state, pos + 1, n, m, r, c, ans);
    }
}
int getMinimumLoss(vector< vector<int> > &mat, int n, int m, int r, int c){
    int res = (1<<30);
    vector<int> state(r);
    tryCombinations(mat, state, 0, n, m, r, c, res);
    return res;
}
int main()
{
    ifstream f("elimin.in");
    ofstream g("elimin.out");
    int n, m, r, c;
    f>>n>>m>>r>>c;
    vector< vector<int> > mat(min(n,m), vector<int>(max(n,m)));
    int globalSum = 0;
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++){
            if(n <= m) {
                f>>mat[i][j];
                globalSum += mat[i][j];
            }
            else {
                f>>mat[j][i];
                globalSum += mat[j][i];
            }
        }
    if(n > m){
        swap(n,m);
        swap(r,c);
    }
    int minimumLoss = getMinimumLoss(mat, n, m, r, c);
    g<<globalSum - minimumLoss;
    return 0;
}