Cod sursa(job #1778833)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 14 octombrie 2016 11:08:58
Problema Lapte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include<bits/stdc++.h>
#define maxD 20010
#define INF INT_MAX
using namespace std;
int n,l,st,dr,mid;
int a[105],b[105],y,comp,sol;
pair<int,int> dp[20035];
int main()
{
    freopen("lapte.in","r",stdin);
    freopen("lapte.out","w",stdout);
    scanf("%d%d",&n,&l);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d",&a[i],&b[i]);
    }
    st=1;
    dr=200*l+5;
    while(st<=dr)
    {
        mid=(st+dr)>>1;
        dp[0]=make_pair(0,0);
        for(int i=1;i<=maxD;i++) dp[i]=make_pair(INF,INF);
       for(int i=1;i<=n;i++)
        {
            y=-1;
            for(int j=a[i];j<=mid;j+=a[i])
            {
                //y=j/a[i];
                y++;
                for(int k=0;k<=(maxD-y);k++)
                {
                    comp=(mid-j);
                    if(dp[k].second==(i-1) && dp[k].first!=INF && (dp[k+(j/a[i])].first==INF || (dp[k+(j/a[i])].first<=(dp[k].first+(comp/b[i])) ||
                                                                                                ( dp[k+(j/a[i])].first==(dp[k].first+(comp/b[i])) && dp[k+(j/a[i])].second>i))))
                    {
                     //   if(dp[k+(j/a[i])].first==(dp[k].first+(comp/b[i])) && dp[k+(j/a[i]].second>i)
                           {
                        dp[k+(j/a[i])].first=dp[k].first+(comp/b[i]);
                        dp[k+(j/a[i])].second=i;
                           }
                    }

                }
            }
        }
       int i=l;
        while(i<=maxD && !(dp[i].first!=INF && dp[i].first>=l))
        {
            i++;
        }
        if(i==(maxD+1))st=mid+1;
            else
            {
                sol=mid;
                dr=mid-1;
            }
    }
    printf("%d\n",sol);
    return 0;
}