Cod sursa(job #2380290)

Utilizator AndreiDeltaBalanici Andrei Daniel AndreiDelta Data 14 martie 2019 18:55:11
Problema Carnati Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <bits/stdc++.h>
#define Dim 2004
using namespace std;
ifstream f("carnati.in");
ofstream g("carnati.out");
long N,C,ras,Ans[Dim];
int ID[Dim],Minim[Dim],People[Dim];

struct point { int time,pay; } V[Dim];

bool cmp(point X,point Y)
{
    if(X.time<Y.time) return 1;
    else return 0;
}

int main()
{
    f>>N>>C;
    for(int i=1;i<=N;i++) f>>V[i].time>>V[i].pay;
    sort(V+1,V+N+1,cmp);
    for(int i=1;i<=N;i++)
    {
        Minim[i]=V[i].pay;
        ID[i]=i;
        Ans[i]=Minim[i]-C;
        People[i]=1;

        for(int j=i-1;j>=1;j--)
        {
            bool ok=1;
            if(V[i].pay>=Minim[j])
        {
            long rez=Ans[j]+Minim[j]-C*(V[i].time-V[j].time);
            //cout<<i<<" "<<j<<" "<<Minim[j]<<" "<<ID[j]<<" "<<V[i].pay<<" "<<rez<<" "<<Ans[i]<<'\n';
            if(rez>=Ans[i])
            {
                ok=0;
                Ans[i]=rez;
                ID[i]=ID[j];
                Minim[i]=Minim[j];
                People[i]=People[j]+1;
            }

        }
        else
        {
            int yup=V[i].pay;
            long rez=yup*People[j]+yup-C*(V[i].time-V[j].time)-C*(V[j].time-V[ID[j]].time+1);
            if(rez>=Ans[i])
            {
                ok=0;
                Ans[i]=rez;
                ID[i]=ID[j];
                Minim[i]=yup;
                People[i]=People[j]+1;
            }
        }


        }
    }
    //cout<<'\n'<<'\n';
    for(int i=1;i<=N;i++)
    {
        ras=max(ras,Ans[i]);
        //cout<<i<<" "<<Ans[i]<<'\n';
    }
    g<<ras;
    return 0;
}