Cod sursa(job #164045)

Utilizator hadesgamesTache Alexandru hadesgames Data 23 martie 2008 14:26:21
Problema Peste Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.03 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;
        }
            if (b[x].nr!=k)
            {
                b[nr].nr=b[x].nr+1;
                if (a[e[i]].a<b[x].b)
                    b[nr].b=a[e[i]].a;
                b[nr].a=b[x].a-b[x].b+a[e[i]].a;
                cod[a[e[i]].a]++;
            }
            else
            {
                b[nr].nr=k;
                if (b[x].b<a[e[i]].a)
                {
                    cod[b[x].b]--;
                    cod[a[e[i]].a]++;
                    for (j=1;j<=1000;j++)
                        if (cod[j])
                            b[nr].b=j;
                    b[nr].a=b[x].a-b[x].b+a[e[i]].a;
                }
                else
                {
                    b[nr].a=b[x].a;
                    b[nr].b=b[x].b;
                }
            }
       }
        c[0]=1;
       for (j=1;j<=nr;j++)
            for (i=0;i<=t;i++)
            {
               if (i+b[j].o<=t&&c[i])
               {
                    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;

}