Cod sursa(job #2698126)

Utilizator YusyBossFares Yusuf YusyBoss Data 21 ianuarie 2021 01:34:36
Problema Carnati Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <iostream>
#include <stdio.h>
#define NMAX 2000

using namespace std;

struct om {
  int T, P;
};

om v[NMAX + 1];

void mysort(int beg, int en) {
  int b, e;
  om piv, aux;

  b = beg; e = en; piv = v[(b + e) / 2];

  while (v[b].T < piv.T)
    b++;
  while (v[e].T > piv.T)
    e--;

  while (b < e) {
    aux = v[b]; v[b] = v[e]; v[e] = aux;

    do b++; while (v[b].T < piv.T);
    do e--; while (v[e].T > piv.T);
  }

  if (beg < e)
    mysort(beg, e);
  if (e + 1 < en)
    mysort(e + 1, en);
}

int maxim(int a, int b) {
  return a > b ? a : b;
}


int main() {
  FILE *fin, *fout;
  int n, c, i, maxprofit, profitcur, newprofit, pret, j;

  fin = fopen("carnati.in", "r");
  fscanf(fin, "%d%d", &n, &c);

  for (i = 1; i <= n; i++)
    fscanf(fin, "%d%d", &v[i].T, &v[i].P);

  mysort(0, n - 1);


  maxprofit = 0;
  v[0].T = v[1].T - 1;
  for (i = 1; i <= n; i++) {
    pret = v[i].P;
    profitcur = 0;
    for (j = 1; j <= n; j++) {
      if (v[j].P < pret)
        newprofit = maxim(profitcur - c * (v[j].T - v[j - 1].T), -c);
      else
        newprofit = maxim(profitcur + pret - c * (v[j].T - v[j - 1].T), pret - c);
      maxprofit = maxim(newprofit, maxprofit);
      profitcur = newprofit;
    }
  }

  fout = fopen("carnati.out", "w");
  fprintf(fout, "%d", maxprofit);
  fclose( fout );
  return 0;
}