Cod sursa(job #1366070)

Utilizator hrazvanHarsan Razvan hrazvan Data 28 februarie 2015 18:53:18
Problema Elimin Scor 50
Compilator c Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <stdio.h>
#define MAXN 15
#define MAXM 7294
int ma[MAXN][MAXM], max = 0;
int n, m, l, c;
int sum[MAXM];
char v[MAXN];

void qs(int st, int dr){
  int i = st, j = dr, piv = sum[(st + dr) / 2], aux;
  while(i <= j){
    while(sum[i] > piv)
      i++;
    while(sum[j] < piv)
      j--;
    if(i <= j){
      aux = sum[i];
      sum[i] = sum[j];
      sum[j] = aux;
      i++;
      j--;
    }
  }
  if(st < j)
    qs(st, j);
  if(i < dr)
    qs(i, dr);
}

inline void solve(){
  int i, j;
  for(i = 0; i < m; i++)
    sum[i] = 0;
  for(i = 0; i < n; i++){
    for(j = 0; j < m; j++){
      if(!v[i])
        sum[j] += ma[i][j];
    }
  }
  qs(0, m - 1);
  int sc = 0;
  for(i = 0; i < m - c; i++)
    sc += sum[i];
  if(max < sc)
    max = sc;
}

void bkt(int pas, int poz){
  if(pas == l){
    solve();
  }
  else{
    int i;
    for(i = poz; i < n; i++){
      v[i] = 1;
      bkt(pas + 1, i + 1);
      v[i] = 0;
    }
  }
}

int main(){
  FILE *in = fopen("elimin.in", "r");
  int i, j, aux;
  fscanf(in, "%d%d%d%d", &n, &m, &l, &c);
  if(m <= MAXN){
    for(i = 0; i < n; i++){
      for(j = 0; j < m; j++){
        fscanf(in, "%d", &ma[j][i]);
      }
    }
    aux = m;
    m = n;
    n = aux;
  }
  else{
    for(i = 0; i < n; i++){
      for(j = 0; j < m; j++){
        fscanf(in, "%d", &ma[i][j]);
      }
    }
  }
  bkt(0, 0);
  FILE *out = fopen("elimin.out", "w");
  fprintf(out, "%d", max);
  fclose(out);
  return 0;
}