Cod sursa(job #477788)

Utilizator freak93Adrian Budau freak93 Data 16 august 2010 13:01:28
Problema Zoo Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include<fstream>
#include<algorithm>
#define player pair<int,int>
#define x first
#define y second

using namespace std;

const char iname[]="echipe.in";
const char oname[]="echipe.out";
const int maxn=260;

ifstream f(iname);
ofstream g(oname);

inline bool fcomp(const player& a,const player& b)
{
    return (a.y-a.x)<(b.y-b.x);
}

player a[maxn],b[maxn],c[maxn];

int n,k,p,i,j,rez,v,dp[maxn][maxn];

int main()
{
    f>>n>>k;
    for(i=1;i<=n;++i)
        f>>a[i].x>>a[i].y;
    sort(a+1,a+n+1,fcomp);
    for(i=n;i>n-k+1;--i)
        rez+=(a[i].y-a[i].x);
    for(i=1;i<=n;++i)
    {
        for(j=1;j<=n;++j)
            if(a[i].x<=a[j].x&&a[i].y>=a[j].y)
                if(a[i].x==a[j].x&&a[i].y==a[j].y)
                    if(i<j)
                        break;
                    else;
                else
                    break;
        if(j>n)
            c[++p]=a[i];
        else
            b[++v]=a[i];
    }
    n=v;
    sort(b+1,b+n+1,fcomp);
    sort(c+1,c+p+1);
    for(i=1;i<=p;++i)
        dp[1][i]=max(0,c[1].y-c[i].x);
    for(i=2;i<=k;++i)
        for(j=i;j<=p;++j)
            for(v=j;v>=i;--v)
            {
                if(c[v].y<=c[j].x)
                    break;
                dp[i][j]=max(dp[i][j],dp[i-1][v-1]+c[v].y-c[j].x);
            }
    v=0;
    for(i=k;i&&n>=0;--i)
    {
        if(dp[i][p]==0&&k<=p)
            break;
        rez=max(rez,dp[i][p]+v);
        if(n==0)
            break;
        v+=b[n].y-b[n].x;
        --n;
    }
    g<<rez<<"\n";
}