Cod sursa(job #1317060)

Utilizator apostolandreiApostol Andrei Laurentiu apostolandrei Data 14 ianuarie 2015 15:09:20
Problema Carnati Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 kb
#include<stdio.h>
#include<stdlib.h>
#define N 2008
#define T 1510
struct carnat{
	int t,p;
} v[N];
int n,c,poz[N],a[T][N];
int comp(const void *a,const void *b){
	carnat x=v[*(int*)a],y=v[*(int*)b];
	if(x.t<y.t)
		return -1;
	if(x.t>y.t)
		return 1;
	if(x.p<y.p)
		return -1;
	if(x.p>y.p)
		return 1;
	return 0;
}
int calcul(int k){
	int s=0,max=0;
	for(int i=0;i<T;++i){
		s+=a[i][v[k].p]*v[k].p-c;
		if(s>max)
			max=s;
		if(s<0)
			s=0;
	}
	return max;
}
int main(){
	freopen("carnati.in","r",stdin);
	freopen("carnati.out","w",stdout);
	scanf("%d%d",&n,&c);
	for(int i=0;i<n;++i){
		scanf("%d%d",&v[i].t,&v[i].p);
		poz[i]=i;
	}
	qsort(poz,n,sizeof(poz[0]),comp);
	a[v[0].t][v[0].p] = 1;
	for(int i=1;i<n;++i)
		if(v[i-1].t==v[i].t)
			a[v[i].t][v[i].p] = 1 + a[v[i-1].t][v[i-1].p];
		else
			a[v[i].t][v[i].p] = 1;
	//for(int i=0;i<n;++i)
	int max=0,x;
	for(int i=0;i<n;++i)
	{
		x=calcul(i);
		if(x>max)
			max=x;
	}
	printf("%d\n",max);
	return 0;
}