Cod sursa(job #592037)

Utilizator rudarelLup Ionut rudarel Data 26 mai 2011 15:01:38
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include<fstream>
#define INF 0x3f3f3f3f
using namespace std;
int N,L,M[202][202],last[202][202],T;
struct bla
{
    int Ta,Tb;
}v[101];
ofstream g("lapte.out");
int dinamica(int t)
{
    int i,j,k,V;
    last[4][2] = 1;
    memset(last,0,sizeof(last));
    memset(M,0,sizeof(M));
    for(i=0;i<=2*L+2;++i)
        for(j=0;j<=2*L+2;++j)
            M[i][j] = -INF;
    M[0][0] = 0;
    for(i=0;i<=N-1;++i)
        for(j=0;j<=L;++j)
            for(k=0;k<=L;++k)
                if(M[i][j]!=-INF && v[i+1].Ta * k<=t)
                {
                    V = (t - v[i+1].Ta*k)/v[i+1].Tb;
                    if(M[i+1][j+k] < M[i][j] + V)
                    {
                        M[i+1][j+k] = M[i][j] + V;
                        last[i+1][j+k] = k;
                    }
                }
    return (M[N][L] >= L);
}
void drum(int l,int c)
{
    if(!l)return;
    drum(l-1,c-last[l][c]);
    g<<last[l][c]<<" "<<(T-v[l].Ta*last[l][c])/v[l].Tb<<"\n";
}
int main()
{
    ifstream f("lapte.in");
    f>>N>>L;
    int i;
    for(i=1;i<=N;++i)
        f>>v[i].Ta>>v[i].Tb;
    f.close();
    int l=0,r=102,mid,x=0;
    while(l<=r)
    {
        mid = (l+r)/2;
        x = dinamica(mid);
        if(x)
        {
            T = mid;
            r = mid-1;
        }
        else
            l = mid+1;
    }
    x = dinamica(T);
     
    g<<T<<"\n";
    drum(N,L);
    g.close();
    return 0;
}