Cod sursa(job #2846891)

Utilizator AndreiDeltaBalanici Andrei Daniel AndreiDelta Data 9 februarie 2022 19:46:15
Problema Lapte Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <bits/stdc++.h>
#define pb push_back
using namespace std;
ifstream f("lapte.in");
ofstream g("lapte.out");
typedef long long ll;
typedef pair<int,int> pi;
int t,T;

struct info{
    int sA,sB,idx;
};

bool ok(int x,int L,vector<info>& v,vector<info>& drink){

    drink.clear();
    int cntA=0,cntB=0;
    for(int i=0;i<v.size();i++){
        int cA = x/v[i].sA;
        if(cntA + cA >= L)
            cA = L - cntA;
        int cB = (x-cA*v[i].sA)/v[i].sB;
        if(cntB + cB >= L)
            cB = L - cntB;
        cntA += cA;
        cntB += cB;
     //   cout<<x<<' '<<L<<' '<<cA<<' '<<cB<<' '<<cntA<<' '<<cntB<<' '<<x-cA*v[i].sA<<' '<<
      //  (x-cA*v[i].sA)/v[i].sB<<' '<<v[i].sA<<' '<<v[i].sB<<'\n';
        drink.pb({cA,cB,v[i].idx});
        if(cntA == L && cntB == L)
            return true;
    }
    return false;

}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int N,L;
    f>>N>>L;
    vector < info > v,drink;
    vector < pi > ansDrink(N+1);
    for(int i=1;i<=N;i++){
        int a,b;
        f>>a>>b;
        v.pb({a,b,i});
    }
    sort(v.begin(),v.end(),[&](info X,info Y){
        if(X.sA == Y.sA)
            return X.sB > Y.sB;
        return X.sA < Y.sA;
     });
    v.resize(v.size());

    int st=0,dr=1e4;
    int ans = -1;
    while(st<=dr){
        int mij=(st+dr)/2;
        if( ok(mij,L,v,drink) ){
            ans = mij;
            ansDrink.clear();
            for(info yy: drink) ansDrink[yy.idx]={yy.sA,yy.sB};
            dr = mij - 1;
        }
        else st = mij + 1;
    }
    g<<ans<<'\n';
    for(int i=1;i<=N;i++) g<<ansDrink[i].first<<' '<<ansDrink[i].second<<'\n';
    return 0;
}