Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <string.h>
- #include <limits.h>
- #define NMAX 505
- #define XMAX 1001
- using namespace std;
- ifstream f("lenes.in");
- ofstream g("lenes.out");
- int mini = XMAX, k, pos = 0, fr[XMAX], maxi;
- int p1 = 0, p2 = 0, p3 = 0, cost = 0;
- int cer, n, m, k1, k2, ans = INT_MAX, v[NMAX][NMAX];
- int i, j, c1, c2, sum;
- void sorteaza(int);
- int lateral(int, int, int);
- int combina(int, int, int, int, int);
- int main() {
- freopen("lenes.in","r",stdin);
- freopen("lenes.out","w",stdout);
- /*FILE *f = fopen("lenes.in", "r");
- FILE *g = fopen("lenes.out", "w");
- f (stdin, "%d\n", &cer);
- f (stdin, "%d %d %d %d\n", &n, &m, &k1, &k2);*/
- cin >> cer;
- cin >> n >> m >> k1 >> k2;
- for(i = 1 ; i <= n ; ++i) {
- for(j = 1 ; j <= m ; ++j) {
- //f (stdin, "%d", v[i]+j);
- cin >> v[i][j];
- v[0][j] += v[i][j];
- }
- v[i][m + 1] = v[i][0] = XMAX;
- }
- if(cer == 1) {
- for(j = 1 ; j <= m ; ++j) {
- sum = v[0][j] + lateral(j - 1, j + 1, k1);
- if(sum < ans) {
- ans = sum;
- //f (stderr, "%d ", j);
- }
- }
- }
- else {
- for(j = 1 ; j <= m ; ++j) {
- sorteaza(j);
- v[n + 1][j] = XMAX;
- }
- //debug matrice
- /*for(i = 1 ; i <= n ; ++i) {
- for(j = 1 ; j <= m ; ++j) {
- f (stderr, "%02d ", v[i][j]);
- }
- f (stderr, "\n");
- }*/
- for(c1 = 1 ; c1 < m - 1 ; ++c1)
- for(c2 = c1 + 1 + (c1 == 1) ; c2 <= m ; ++c2) {
- sum = v[0][c1] + v[0][c2];
- if(c2 - c1 > 2) {
- sum += lateral(c1 - 1, c1 + 1, k1) + lateral(c2 - 1, c2 + 1, k2);
- }
- else if(c2 - c1 == 1) {
- sum += lateral(0, c1 - 1, k1) + lateral(0, c2 + 1, k2);
- }
- else {
- sum += combina(c1 - 1, c1 + 1, c2 + 1, k1, k2);
- }
- if(sum < ans) {
- ans = sum;
- //f (stderr, "%d %d %d\n", c1, c2, sum);
- //cerr << c1 << ' ' << c2 << ' ' << sum << '\n';
- }
- // if(c1 == 11 && c2 == 12)
- //cout << sum << '\n';
- }
- }
- //f (stdout, "%d\n", ans);
- cout << ans << '\n';
- return 0;
- }
- int lateral(int c1, int c2, int k) {
- mini = XMAX, pos = 0, cost = 0;
- memset(fr, 0, sizeof(fr));
- for(i = 1 ; i <= n ; ++i) {
- ++fr[v[i][c1]];
- ++fr[v[i][c2]];
- if(v[i][c1] < mini)
- mini = v[i][c1];
- if(v[i][c2] < mini)
- mini = v[i][c2];
- }
- for(i = mini ; pos < k ; ++i) {
- while(fr[i]-- && pos < k)
- cost += i, ++pos;
- }
- return cost;
- }
- void sorteaza(int j) {
- maxi = 0;
- memset(fr, 0, sizeof(fr));
- for(i = 1 ; i <= n ; ++i) {
- fr[v[i][j]]++;
- if(v[i][j] > maxi)
- maxi = v[i][j];
- if(v[i][j] < mini)
- mini = v[i][j];
- }
- i = 0;
- for(k = mini ; k <= maxi ; ++k)
- while(fr[k]--)
- v[++i][j] = k;
- }
- int combina(int c1, int c2, int c3, int k1, int k2) {
- p1 = 0, p2 = 0, p3 = 0, cost = 0;
- while(k1 + k2 > p2) {
- if(k1 == 0) {
- if(v[p2 + 1][c2] <= v[p3 + 1][c3]) {
- ++p2;
- }
- else {
- ++p3;
- --k2;
- }
- }
- else if(k2 == 0) {
- if(v[p1 + 1][c1] <= v[p2 + 1][c3]) {
- ++p1;
- --k1;
- }
- else {
- ++p2;
- }
- }
- else if(v[p1 + 1][c1] <= v[p2 + 1][c2] && v[p1 + 1][c1] <= v[p3 + 1][c3]) {
- ++p1;
- --k1;
- }
- else if(v[p2 + 1][c2] <= v[p1 + 1][c1] && v[p2 + 1][c2] <= v[p3 + 1][c3]) {
- ++p2;
- }
- else {
- ++p3;
- --k2;
- }
- }
- for(i = 1 ; i <= p1 ; ++i)
- cost += v[i][c1];
- for(i = 1 ; i <= p2 ; ++i)
- cost += v[i][c2];
- for(i = 1 ; i <= p3 ; ++i)
- cost += v[i][c3];
- return cost;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement