Cod sursa(job #2799228)

Utilizator iancupoppPopp Iancu Alexandru iancupopp Data 12 noiembrie 2021 17:59:57
Problema Elimin Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
  ifstream cin("elimin.in");
  ofstream cout("elimin.out");
  int nl, nc, l, c;
  bool swapped = false;
  cin >> nl >> nc >> l >> c;
  vector<vector<int>> mat;
  vector<int> sc, sc_ord;
  if (nl > nc) {
    swapped = true;
    mat = vector<vector<int>>(nc, vector<int>(nl));
    sc = vector<int>(nl);
    sc_ord = vector<int>(nl);
  } else {
    mat = vector<vector<int>>(nl, vector<int>(nc));
    sc = vector<int>(nc);
    sc_ord = vector<int>(nc);
  }
  int sum = 0;
  for (int i = 0; i < nl; ++i)
    for (int j = 0; j < nc; ++j) {
      if (!swapped)  {
        cin >> mat[i][j];
        sc[j] += mat[i][j];
        sum += mat[i][j];
      } else {
        cin >> mat[j][i];
        sc[i] += mat[j][i];
        sum += mat[j][i];
      }
    }
  cin.close();
  if (swapped) {
    swap(nl, nc);
    swap(l, c);
  }
  int p2max = (1 << nl), max_sum = 0;
  for (int mask = 0; mask < p2max; ++mask) {
    if (__builtin_popcount(mask) != l)
      continue;
    sc_ord = sc;
    int new_sum = sum;
    for (int i = 0; (1 << i) <= mask; ++i)
      if (mask & (1 << i))
        for (int j = 0; j < nc; ++j) {
          new_sum -= mat[i][j];
          sc_ord[j] -= mat[i][j];
        }
    sort(sc_ord.begin(), sc_ord.end());
    for (int i = 0; i < c; ++i)
      new_sum -= sc_ord[i];
    max_sum = max(max_sum, new_sum);
  }
  cout << max_sum << "\n";
  cout.close();
  return 0;
}