Cod sursa(job #2203440)

Utilizator bogdi1bogdan bancuta bogdi1 Data 12 mai 2018 12:28:40
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <cstdio>
#include <algorithm>
using namespace std;
struct Petrecareti
{
    int ta,tb;
} v[105];
int sepoate[105][105];
int bmax[105][105];
int n,l;
struct Solutie
{
    int a,b;
} sol[105];
bool verif(int t)
{
    int i,j,k;
    for(i=0; i<=n; i++)
        for(j=0; j<=l; j++)
            sepoate[i][j]=-1e9;
    for(i=1; i<=n; i++)
        for(j=0; j<=l; j++)
            bmax[i][j]=(t-j*v[i].ta)/v[i].tb;
    sepoate[0][0]=0;
    for(i=1; i<=n; i++)
        for(j=0; j<=l; j++)
            for(k=0; k<=j && t-k*v[i].ta>=0; k++)
                sepoate[i][j]=max(sepoate[i][j], sepoate[i-1][j-k]+bmax[i][k]);
    return sepoate[n][l]>=l;
}
int bs(int st, int dr)
{
    int last,med;
    while(st<=dr){
        med=(st+dr)/2;
        if(verif(med)==1){
            last=med;
            dr=med-1;
        }
        else
            st=med+1;
    }
    return last;
}
int main()
{   freopen("lapte.in", "r",stdin);
    freopen("lapte.out", "w",stdout);
    int i,t,a,j;
    scanf("%d%d", &n, &l);
    for(i=1; i<=n; i++)
        scanf("%d%d", &v[i].ta, &v[i].tb);
    t=bs(1, 100);
    printf("%d\n", t);
    verif(t);
    a=l;
    for(i=n; i>0; i--){
        for(j=0; j<=a && t-j*v[i].ta>=0; j++){
            if(sepoate[i-1][a-j]+bmax[i][j]==sepoate[i][a]){
                sol[i].a=j;
                sol[i].b=bmax[i][j];
                a=a-j;
                break;
            }
        }
    }
    for(i=1; i<=n; i++)
        printf("%d %d\n", sol[i].a, sol[i].b);
    return 0;
}