Cod sursa(job #1951921)

Utilizator Andrei2000Andrei Mihailescu Andrei2000 Data 3 aprilie 2017 21:05:42
Problema Lapte Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("lapte.in");
ofstream fout ("lapte.out");
int n,l,m[102][1020],ma[102][102],qq,maxo;
struct{
    int a,b;
}v[102];

int doit(int T){
    for(int i=0;i<=n;++i)
        for(int j=1;j<=1000;++j)
            m[i][j]=-1;
    m[0][0]=0;
    for(int i=0;i<n;++i){
        for(int j=0;j<=1000;++j){
            if(m[i][j]!=-1){
                for(int k=0;k<=T/v[i+1].b;++k){
                    int w=m[i][j]+(T-k*v[i+1].b)/v[i+1].a;
                    if(w>m[i+1][k+j]){m[i+1][k+j]=w;ma[i+1][k+j]=j;}
                }
            }
        }
    }
    for(int i=l;i<=1000;++i)
        if(m[n][i]>=l)return i;
        else return 0;
}

void recurs(int qqq, int qq){
    if(!qqq)return;
    recurs(qqq-1,ma[qqq][qq]);
    fout<<m[qqq][qq]-m[qqq-1][ma[qqq][qq]]<<' '<<qq-ma[qqq][qq]<<'\n';
}

int main()
{
    int maxx=-1;
    fin>>n>>l;
    for(int i=1;i<=n;++i)
        fin>>v[i].a>>v[i].b;
    int p=1,q=100;
    while(p<=q){
        int mt=(p+q)/2,qq=doit(mt);
        if(qq){maxx=mt;q=mt-1;maxo=qq;}
        else p=mt+1;
    }
    doit(maxx);
    fout<<maxx<<'\n';
    recurs(n,maxo);
    return 0;
}