Cod sursa(job #234744)

Utilizator Andrei200Andrei200 Andrei200 Data 21 decembrie 2008 21:18:09
Problema Heavy metal Scor 40
Compilator c Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <stdio.h>

int n,i,j,Best[100000],b[100000],a[100000],maxim,x,y,frecv[100000];
char ch[30];

int max(int a,int b)
{
    if (a>b)
    return a;
    else
    return b;
}

void qsort(long int l, long int r)
{
 long int x,y;
 i=l;
 j=r;
 x=a[(l+r)>>1];
 do
    {
    while ((a[i]<x)&&(i<n)) ++i;
    while ((x<a[j])&&(j>1)) --j;
    if (i<=j)
        {
        y=a[i];
        a[i]=a[j];
        a[j]=y;
        y=b[i];
        b[i]=b[j];
        b[j]=y;
        ++i;
        --j;
        }
    }
 while (i<=j);
 if (l<j) qsort(l,j);
 if (i<r) qsort(i,r);
}

int main()
{
    freopen("heavymetal.in","rt",stdin);
    scanf("%d", &n);
    //freopen("heavymetal.out","wt",stdout);
    gets(ch);
     for (i=1;i<=n;++i)
          {
               // scanf("%d %d", &a[i],&b[i]);
           gets(ch);
           x=y=j=0;
           while (ch[j]!=' ')
                  {
                        x=x*10+ch[j]-'0';
                        j++;
                        }
                        j++;
           while (ch[j])
           {
                y=y*10+ch[j]-'0';
                j++;
                }
            a[i]=x;
            b[i]=y;  
           // printf("%d %d\n", x,y);
            maxim=max(maxim,b[i]);
        }
    qsort(1,n);
    for (i=1;i<=maxim;++i)
          {    
            Best[i]=Best[i-1]; 
            frecv[b[i]-a[i]]++;
           for (j=1;j<=maxim;++j)
           if (b[j]==i)   
        Best[i]=max(Best[i],Best[a[j]]+(b[j]-a[j]));  
}

freopen("heavymetal.out","wt",stdout);
printf("%ld", Best[maxim]);
return 0;
}