Cod sursa(job #2698760)

Utilizator Antonia_onisoruantonia onisoru Antonia_onisoru Data 22 ianuarie 2021 22:06:37
Problema Carnati Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

ifstream in("carnati.in");
ofstream out("carnati.out");

const int MAXN = 2000;

int timp[MAXN], pret[MAXN], s[MAXN];

void quicksort( int inf, int sup ){
    int i, j, x, t;
    i = inf;
    j = sup;
    x = timp[ ( i + j ) / 2 ];
    while( i <= j ){
      while( ( i < sup ) && ( timp[i] < x ) )i++;
      while( ( j > inf ) && ( timp[j] > x ) )j--;
      if( i <= j ){
        swap( timp[i], timp[j] );
        swap( pret[i], pret[j] );
        i++;
        j--;
      }
    }
    if( j > inf ) quicksort( inf, j );
    if( i <sup ) quicksort( i, sup );
}

int main()
{
    int n, c, i, sum, profit, j, t;
    in>>n>>c;
    for( i = 0; i < n; i++ ){
      in>>timp[i]>>pret[i];
    }

    quicksort( 0, n - 1 );

    profit = -1;
    t = 0;
    for( i = 0; i < n; i++ ){

      sum = pret[i];
      t = 0;

      if( pret[0] >= sum )
        s[0] = sum;
      else
        s[0] = 0;

      for( j = 1; j < n; j++ ){
        if( s[ j - 1 ] - c * ( timp[j] - timp[ j - 1 ] ) > 0 ){
          s[j] = s[ j - 1 ] - c * ( timp[j] - timp[ j - 1 ] );
        }
        else
          s[j] = 0;
        if( pret[j] >= sum )
            s[j] = s[j] + sum;

      }

      for( j = 0; j < n; j++ ){
        if( profit < s[j] )
          profit = s[j];
        s[j] = 0;
      }
    }

    out<<profit - c;
    return 0;
}