Cod sursa(job #2491036)

Utilizator Stefan_PiscuPiscu Stefan Constantin Stefan_Piscu Data 11 noiembrie 2019 18:20:17
Problema Lapte Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("lapte.in");
ofstream fout("lapte.out");

pair<int, int> v[103];


int n;
int dp[103][103], l;
pair<int, int> dpp[103][103];

bool getdp(int t){
    for(int i=0;i<=n;++i)
        for(int j=0;j<=l;++j) dp[i][j]=-(1<<30);
    dp[0][0]=0;
    for(int i=1;i<=n;++i){
        for(int j=1;j<=l;++j){
            for(int k=j;k>=0;--k){
                int d=(j-k)*v[i].second;
                if(d>t) k=-1;
                else if(dp[i][j]<dp[i-1][k]+(t-d)/v[i].first){
                    dp[i][j]=dp[i-1][k]+(t-d)/v[i].first;
                    dpp[i][j]=make_pair((t-d)/v[i].first, j-k);
                }

            }
        }
    }
    if(dp[n][l]>=l) return 1;
    return 0;
}

void show(int i, int j){
    if(i!=1) show(i-1, j-dpp[i][j].second);
    fout<<dpp[i][j].first<<" "<<dpp[i][j].second<<"\n";
}

int main(){
    fin>>n>>l;
    for(int i=1;i<=n;++i){
        fin>>v[i].first>>v[i].second;
    }
    int st=1, dr=103, sol=dr;
    while(st<=dr){
        if(getdp((st+dr)/2)) sol=(st+dr)/2, dr=(st+dr)/2-1;
        else st=(st+dr)/2+1;
    }
    getdp(sol);
    fout<<sol<<"\n";
    show(n, l);
    return 0;
}