Cod sursa(job #1892100)

Utilizator tiberiu.bucur17Tiberiu Constantin Emanoil Bucur tiberiu.bucur17 Data 24 februarie 2017 18:04:05
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <cstdio>
#define INF 2000000000
#define MAXN 101
int d[MAXN][MAXN],p[MAXN][MAXN],a[MAXN],b[MAXN],sol[MAXN],n,q;
inline int verif(int t)
{
    int x;
    for(int i=1;i<=q;i++)
        d[0][i]=-INF;
    for(int i=1;i<=n;i++)
        for(int j=0;j<=q;j++)
        {
            d[i][j]=d[i-1][j]+t/b[i];p[i][j]=0;
            for(int k=1;k<=j && k*a[i]<=t;k++)
            {
                x=d[i-1][j-k]+(t-k*a[i])/b[i];
                if(d[i][j]<x)
                    d[i][j]=x,p[i][j]=k;
            }
        }
    return d[n][q];
}
int cbin()
{
    int i=0,pas;
    for(pas=1<<14;pas;pas>>=1)
        if(verif(i+pas)<q)
            i+=pas;
    return i+1;
}
int main()
{
    FILE *fin,*fout;
    fin=fopen("lapte.in","r");
    fout=fopen("lapte.out","w");
    fscanf(fin,"%d%d",&n,&q);
    for(int i=1;i<=n;i++)
        fscanf(fin,"%d%d",&a[i],&b[i]);
    int x,t=cbin();
    fprintf(fout,"%d\n",t);
    x=verif(t);
    for(int i=n;i;i--)
    {
        sol[i]=p[i][q];
        q-=sol[i];
    }
    for(int i=1;i<=n;i++)
        fprintf(fout,"%d %d\n",sol[i],(t-sol[i]*a[i])/b[i]);
    fclose(fin);
    fclose(fout);
    return 0;
}