Cod sursa(job #2922419)

Utilizator 100pCiornei Stefan 100p Data 8 septembrie 2022 11:14:11
Problema Lapte Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.48 kb
#include <bits/stdc++.h>
#define int long long
#define FILES freopen("lapte.in","r",stdin);\
            freopen("lapte.out","w",stdout);
using namespace std;
struct bottle
{
    int ma, mb, index;
};
int n,l,ansA[205],ansB[205];
vector<bottle> v;
bool cmp(bottle a,bottle b)
{
    return a.mb < b.mb;
}
signed main()
{
    FILES
    cin >> n >> l;
    for(int i = 1; i <= n; ++i)
        {
            int a,b;
            cin >> a >> b;
            v.push_back({a,b,i});
        }
    sort(v.begin(),v.end(),cmp);
    int st = 0,dr = 1e9, ans = 0;
    while(st <= dr)
        {
            int mid = (st + dr) >> 1;
            int s1 = 0,s2 = 0;
            for(int i = 0; i < v.size(); ++i)
                s1 += mid / v[i].ma;
            bool ok = 1;
            for(int i = 0; i < v.size() && (s1 < l || s2 < l); ++i)
                {
                    s2 += mid / v[i].mb;
                    s1 -= mid / v[i].ma;
                    if(s1 < l && s2 < l)
                        {
                            ok = 0;
                            break;
                        }
                    if(s1 < l && s2 >= l)
                        {
                            while(s1 < l && s2 > l)
                                {
                                    s1++,s2--;
                                }
                            if(s1 < l || s2 < l)
                                {
                                    ok = 0;
                                    break;
                                }
                            break;
                        }
                }
            if(ok) dr = mid - 1, ans = mid;
            else st = mid + 1;
        }
    cout << ans << '\n';
    int s1 = 0,s2 = 0;
    for(int i = 0; i < v.size(); ++i)
        ansA[v[i].index] = ans / v[i].ma, s1 += ans / v[i].ma;
    for(int i = 0; i < v.size() && (s1 < l || s2 < l); ++i)
        {
            ansA[v[i].index] = 0;
            ansB[v[i].index] = ans / v[i].mb;
            s2 += ans / v[i].mb;
            s1 -= ans / v[i].ma;
            if(s1 < l && s2 >= l)
                {
                    while(s1 < l && s2 > l)
                        {
                            s1++,s2--;
                            ansA[v[i].index]++, ansB[v[i].index]--;
                        }
                    break;
                }
        }
        for(int i = 1;i <= n; ++i)
            cout << ansA[i] << ' '<< ansB[i] << '\n';

}