Cod sursa(job #138839)

Utilizator swift90Ionut Bogdanescu swift90 Data 19 februarie 2008 12:28:17
Problema Carnati Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include<stdio.h>   
#include<algorithm>   
using namespace std;   
struct magazin{   
    int max,p,cump;   
};   
magazin mag[2010];   
pair <int, int> nr[2010];   
int main(){   
    freopen("carnati.in","r",stdin);   
    freopen("carnati.out","w",stdout);   
    int n,c,maxim,i,j;   
       
    scanf("%d%d",&n,&c);   
    for(i=0;i<n;++i)   
        scanf("%d%d",&nr[i].first,&nr[i].second);   
    maxim=-1000000000;   
    sort(nr,nr+n);   
    for(i=0;i<n;++i){   
        mag[i].max=nr[i].second-c;   
        mag[i].p=nr[i].second;   
        mag[i].cump=1;   
        if(mag[i].max>maxim)   
            maxim=mag[i].max;   
        for(j=i-1;j>=0;--j){   
            if(nr[i].second>mag[j].p){   
                if(mag[j].max+mag[j].p-c*(nr[i].first-nr[j].first+1)>mag[i].max){   
                    mag[i].max=mag[j].max+mag[j].p-c*(nr[i].first-nr[j].first+1);
					if(mag[j].cump>1)
						mag[i].max+=c;
                    mag[i].cump=mag[j].cump+1;
                    mag[i].p=mag[j].p;   
                }   
            }   
            else{   
                if(mag[j].max+nr[i].second-c*(nr[i].first-nr[j].first+1)-mag[j].cump*(mag[j].p-nr[i].second)>mag[i].max){   
                    mag[i].max=mag[j].p+nr[i].second-c*(nr[i].first-nr[j].first+1)-mag[j].cump*(mag[j].p-nr[i].second);   
                    mag[i].p=nr[i].second;
					if(mag[j].cump>1)
						mag[i].max+=c;
                    mag[i].cump=mag[j].cump+1;   
                }   
            }   
            if(mag[i].max>maxim)   
                maxim=mag[i].max;   
        }   
    }   
       
    if(maxim<0)   
        printf("0\n");   
    else  
        printf("%d\n",maxim);   
       
    fclose(stdin);   
    fclose(stdout);   
    return 0;   
}