Cod sursa(job #2313271)

Utilizator mirunazMiruna Zavelca mirunaz Data 6 ianuarie 2019 15:43:16
Problema Elimin Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.24 kb
#include <fstream>
#include <stdlib.h>
#include <algorithm>

using namespace std;

void elimin(int k, int p, int n, int v[], int pp, int **a, int &maxx) {
    int i, j, b[n + 1];
    for(j = 1; j <= n; j ++) {
        if(pp == 1) {
            b[j] = a[j][0];
        } else {
            b[j] = a[0][j];
        }
    }

    for(i = 1; i <= k; i ++) {
        for(j = 1; j <= n; j ++) {
            if (pp == 1) {
                b[j] -= a[j][v[i]];
            } else {
                b[j] -= a[v[i]][j];
            }
        }
    }

    int sum = 0;
    for(j = 1; j <= n; j ++) {
        sum += b[j];
    }

    sort(b + 1, b + n + 1);
    for(i = 1; i <= p; i++) {
        sum -= b[i];
    }

    if(sum > maxx) {
        maxx = sum;
    }
}

void bkt(int i, int k, int n, int v[], int pp, int **a, int numarDeParcurs, int numarCerutNou, int &maxx)
{
    int j;
    for(j = 1; j <= n; j ++)
    {
        v[i] = j;
        if(i <= 1 || v[i] > v[i - 1]) {
            if (i == k) {
                elimin(k, numarCerutNou, numarDeParcurs, v, pp, a, maxx);
            } else {
                bkt(i + 1, k, n, v, pp, a, numarDeParcurs, numarCerutNou, maxx);
            }
        }
    }
}

int **init(int n, int m) {
    int **a = (int **) malloc((m + 1) * sizeof(int*));
    int i;
    for(i = 0; i <= m; i ++) {
        a[i] = (int *) malloc((n+1) * sizeof(int));
        a[i][0] = 0;
    }

    for(i = 0; i <= n; i ++) {
        a[0][i] = 0;
    }

    return a;
}

void afisare(int n, int m, int **a) {
    int i, j;
    for(i = 0; i <= m; i ++) {
        for(j = 0; j <= n; j ++) {
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }
}

int main()
{
    FILE *in = fopen("elimin.in", "r");
    FILE *out = fopen("elimin.out", "w");
    int m, n, r, c;
    fscanf(in, "%d %d %d %d", &m, &n, &r, &c);

    int i, j;
    int **a = init(n, m);
    for(i = 1; i <= m; i ++) {
        for(j = 1; j <= n; j ++) {
            fscanf(in, "%d", &a[i][j]);
            a[i][0] += a[i][j];
            a[0][j] += a[i][j];
        }
    }

    int sum = 0;
    if(n < m) {
        int v[c + 1];
        bkt(1, c, n, v, 1, a, m, r, sum);
    } else {
        int v[r + 1];
        bkt(1, r, m, v, 2, a, n, c, sum);
    }

    fprintf(out, "%d", sum);

    return 0;
}