Cod sursa(job #181964)

Utilizator ciprianfFarcasanu Alexandru Ciprian ciprianf Data 20 aprilie 2008 08:38:45
Problema Carnati Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include <stdio.h>
#include <stdlib.h>
struct ab{
	int a,b;
};
ab v[2001];
int best[2001];
int comp(const void *a,const void *b){
	ab *aa=(ab*)a,*bb=(ab*)b;
	ab aaa=*aa,bbb=*bb;
	if(aaa.a>bbb.a) return 1;
	if(aaa.a==bbb.a && aaa.b<bbb.b) return -1;
	if(aaa.a<bbb.a) return -1;
	return 0;
}
int maxim(int x, int y){
	if(x>y) return x;
	return y;
}
int main(){
	int i,n,c,j,poz,max=0,s,min;
	freopen("carnati.in","r",stdin);
	freopen("carnati.out","w",stdout);
	scanf("%d%d",&n,&c);
	for(i=1;i<=n;i++)
		scanf("%d%d",&v[i].a,&v[i].b);
	v[0].a=v[0].b=-10;
	qsort(v,n+1,sizeof(v[0]),comp);
	for(i=1;i<=n;i++){
		s=0;
		poz=1;
		for(j=1;j<=n;j++){
			if(v[j].b>=v[i].b) s+=v[i].b;
			if(s-(v[j].a-v[poz].a+1)*c>max) max=s-(v[j].a-v[poz].a+1)*c;
			if(s-(v[j].a-v[poz].a+1)*c<0){
				s=0;
				poz=j+1;
				if(v[i].b-c>s && v[j].b>=v[i].b){
					s=v[i].b-c;
					poz=j;
					}
				max=maxim(s,max);
			}
		}
	}
	printf("%d",max);
}