Cod sursa(job #137567)

Utilizator swift90Ionut Bogdanescu swift90 Data 17 februarie 2008 12:41:31
Problema Carnati Scor 10
Compilator cpp Status done
Runda preONI 2008, Runda 4, Clasa a 10-a Marime 1.17 kb
#include<stdio.h>
struct magazin{
	int max,p,cump;
};
magazin mag[2010];
struct cumpar{
	int t,p;
};
cumpar 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].t,&nr[i].p);
	maxim=-1000000000;
	for(i=0;i<n;++i){
		mag[i].max=nr[i].p-c;
		mag[i].p=nr[i].p;
		mag[i].cump=1;
		if(mag[i].max>maxim)
			maxim=mag[i].max;
		for(j=i-1;j>=0;--j){
			if(nr[i].p>mag[j].p){
				if(mag[j].max+mag[j].p-c*(nr[i].t-nr[j].t+1)>mag[i].max){
					mag[i].max=mag[j].max+mag[j].p-c*(nr[i].t-nr[j].t+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].p-c*(nr[i].t-nr[j].t+1)-mag[j].cump*(mag[j].p-nr[i].p)>mag[i].max){
					mag[i].max=mag[j].p+nr[i].p-c*(nr[i].t-nr[j].t+1)-mag[j].cump*(mag[j].p-nr[i].p);
					mag[i].p=nr[i].p;
					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;
}