Cod sursa(job #164083)

Utilizator hadesgamesTache Alexandru hadesgames Data 23 martie 2008 15:17:14
Problema Peste Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <stdio.h>
#include <stdlib.h>
struct ceva
{
    long long a,b;
};
struct ceva2
{
    long long a,o,nr,b;
};
long long c[50005];
ceva a[50005];
ceva2 b[1005];
long long e[50005];
long long cod[1005];
long long max,nr,i,j,k,n,t,x,p=1,u=0;
int compare(const void *a2,const void *b2)
{
    long long *aa=(long long *)a2,*bb=(long long*)b2;
    if (a[*aa].b>a[*bb].b)
        return 1;
    if (a[*aa].b<a[*bb].b)
        return -1;
   return 0;
}
int main()
{
    FILE *in,*out;
    in=fopen("peste.in","r");
    out=fopen("peste.out","w");
    fscanf(in,"%lld%lld%lld",&n,&k,&t);
    for (i=1;i<=n;i++)
    {
        fscanf(in,"%lld%lld",&a[i].a,&a[i].b);
        e[i]=i;
	}
	qsort(e+1,n,sizeof(e[1]),compare);
     
	for (i=1;i<=n;i++)
	{
        x=nr;
        if (a[e[i]].b!=b[nr].o)
        {
            nr++;
            b[nr].o=a[e[i]].b;
        }
		b[nr].a=b[x].a;
		b[nr].b=b[x].b;
		b[nr].nr=b[x].nr;
		if (b[nr].nr!=k)
		{
			b[nr].nr++;
			b[nr].a+=a[e[i]].a;
			if (a[e[i]].a<b[nr].b)
				b[nr].b=a[e[i]].a;
			cod[a[e[i]].a]++;
		}
		else
		{
            b[nr].nr=k;
            if (b[nr].b<a[e[i]].a)
            {
                cod[b[nr].b]--;
                cod[a[e[i]].a]++;
				b[nr].a+=-b[nr].b+a[e[i]].a;
				for (j=1;j<=1000;j++)
                        if (cod[j])
						{
                            b[nr].b=j;
							break;
						}
			}
			
       }
	}


        c[0]=1;
		max=1;
       for (j=1;j<=nr;j++)
            for (i=0;i<=t;i++)
            {
               if (i+b[j].o<=t&&c[i])
               {
					if (c[i+b[j].o]<c[i]+b[j].a)
							c[i+b[j].o]=c[i]+b[j].a;
                    if (max<c[i+b[j].o])
                        max=c[i+b[j].o];
               }
            }
       if (max)
            max--;
       fprintf(out,"%lld",max);
       fclose(in);
       fclose(out);
       return 0;
}