Cod sursa(job #2020364)

Utilizator victoreVictor Popa victore Data 9 septembrie 2017 22:55:03
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include<cstdio>
#include<vector>

using namespace std;

const int nmax=105;
const int inf=1e9;

typedef pair<int,int> ii;

ii st[nmax];

int top,n,L;
int dp[nmax][nmax],mm[nmax][nmax],a[nmax],b[nmax];

inline bool check(int val)
{
    int i,j,k;
    for(i=0;i<=n;++i)
        for(j=0;j<=L;++j)
            dp[i][j]=-inf,mm[i][j]=0;
    for(i=1,dp[0][0]=0;i<=n;i++)
        for(j=0;j<=L;++j)
            for(k=0;k<=j;++k)
                if(val - (j-k)*a[i] >= 0 && dp[i][j] < dp[i-1][k] + (val - (j-k)*a[i])/b[i])
                    dp[i][j] = dp[i-1][k] + (val - (j-k)*a[i])/b[i],mm[i][j]=k;
    return dp[n][L] >= L;
}


inline void findsol(int x)
{
    check(x);
    int i,j,k;
    for(i=n,j=L,k=0;i;j=k,--i)
        k=mm[i][j],st[i].first = j-k,st[i].second = dp[i][j] - dp[i-1][k];
    for(i=1;i<=n;++i)
        printf("%d %d\n",st[i].first,st[i].second);
}

int main()
{
    freopen("lapte.in","r",stdin);
    freopen("lapte.out","w",stdout);
    int i,j;
    scanf("%d%d",&n,&L);
    for(i=1;i<=n;++i)
        scanf("%d%d",&a[i],&b[i]);
    int step;
    for(step=1;step<10000;step<<=1);
    for(i=10000;step;step>>=1)
        if(check(i-step))
            i-=step;
    printf("%d\n",i);
    findsol(i);
    return 0;
}