Cod sursa(job #2697824)

Utilizator teochess2017Togan Teodor-Bogdan teochess2017 Data 19 ianuarie 2021 19:32:26
Problema Carnati Scor 70
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <stdio.h>
#include <stdlib.h>

#define MAXN 2000

int v[2][MAXN + 1], smax[MAXN + 1];

void swap(int i, int j){
  int aux;
  aux = v[0][i];
  v[0][i] = v[0][j];
  v[0][j] = aux;
  aux = v[1][i];
  v[1][i] = v[1][j];
  v[1][j] = aux;
}
void quicksort(int min, int max){
  int b, e, piv;
  piv = v[0][(min + max) / 2];
  b = min;
  e = max;
  while(piv > v[0][b]){
    b++;
  }
  while(piv < v[0][e]){
    e--;
  }
  while(b < e){
    swap(b, e);
    do{
      b++;
    }while(piv > v[0][b]);
    do{
      e--;
    }while(piv < v[0][e]);
  }
  if(min < e){
    quicksort(min, e);
  }
  if((e + 1) < max){
    quicksort(e + 1, max);
  }
}

int main()
{
    FILE *fin, *fout;
    int n, c, i, j, min, max, s, maxsubs, out;
    fin = fopen("carnati.in", "r");
    fscanf(fin, "%d%d", &n, &c);
    for(i = 1; i <= n; i++){
      fscanf(fin, "%d%d", &v[0][i], &v[1][i]);
    }
    fclose(fin);
    quicksort(1, n);
    j = 0;
    min = 1000000;
    out = 0;
    for(i = 1; i <= n; i++){
      max = smax[i - 1] - (v[0][i] - v[0][i - 1]) * c;
      if(min <= v[1][i]){
        max += min;
      }
      s = maxsubs = v[1][i] - c;
      for(j = i - 1; 0 < j; j--){
        s = s - (v[0][j + 1] - v[0][j]) * c;
        if(v[1][i] <= v[1][j]){
          s = s + v[1][i];
        }
        if(maxsubs < s){
          maxsubs = s;
        }
      }
      if(max < maxsubs){
        max = maxsubs;
        min = v[1][i];
      }
      smax[i] = max;
      if(out < smax[i]){
        out = smax[i];
      }
    }
    fout = fopen("carnati.out", "w");
    fprintf(fout, "%d", out);
    fclose(fout);
    return 0;
}