Cod sursa(job #138602)

Utilizator swift90Ionut Bogdanescu swift90 Data 18 februarie 2008 21:53:17
Problema Carnati Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 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;
					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;
}