Cod sursa(job #1801879)

Utilizator VladTiberiuMihailescu Vlad Tiberiu VladTiberiu Data 9 noiembrie 2016 18:06:11
Problema Lapte Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.46 kb
#include <bits/stdc++.h>

#define INF 0x3f3f3f3f
#define NMax 102
using namespace std;
ifstream f("lapte.in");
ofstream g("lapte.out");

struct info2{
    int x,y,ind;
};

info2 v[NMax],a[NMax],b[NMax];
int n,l;

bool verif(int x){
    int lA = l, lB = l;
    for(int i = 1; i <= n; ++i){
        v[i].x = 0;v[i].y = 0;
    }
    for(int i = 1; i <= n && lA; ++i){
        if(lA - (x / a[i].x) > 0){
            lA -= (x / a[i].x);
            v[a[i].ind].x = (x / a[i].x);
        }else{
            v[a[i].ind].x = lA;
            lA = 0;
        }
    }
    for(int i = 1; i <= n && lB; ++i){
        int w = (x - v[b[i].ind].x * b[i].x);
        if(lB - (w / b[i].y) > 0){
            lB -= (w / b[i].y);
            v[b[i].ind].y = (w / b[i].y);
        }else{
            v[b[i].ind].y = lB;
            lB = 0;
        }
    }
    if(lA == 0 && lB == 0)
        return 1;

    for(int i = 1; i <= n; ++i){
        v[i].x = 0;v[i].y = 0;
    }
    lA = l, lB = l;
    for(int i = 1; i <= n && lB; ++i){
        if(lB - (x / b[i].y) > 0){
            lB -= (x / b[i].y);
            v[b[i].ind].y = (x / b[i].y);
        }else{
            v[b[i].ind].y = lB;
            lB = 0;
        }
    }
    for(int i = 1; i <= n && lA; ++i){
        int w = (x - v[a[i].ind].y * a[i].y);
        if(lA - (w / a[i].x) > 0){
            lA -= (w / a[i].x);
            v[a[i].ind].x = (w / a[i].x);
        }else{
            v[a[i].ind].x = lA;
            lA = 0;
        }
    }
    if(lA == 0 && lB == 0)
        return 1;
    return 0;
}
void cautbin(int lo,int hi){
    int mid;
    while(lo <= hi){
        mid = (lo + hi) / 2;
        int ok2 = verif(mid - 1);
        int ok1 = verif(mid);
        if(ok1 == 1 && ok2 == 0){
            g << mid << '\n';
            for(int i = 1; i <= n; ++i){
                g << v[i].x << ' ' << v[i].y << '\n';
            }
            return;
        }else
        if(ok1 == 1){
            hi = mid - 1;
        }else
        if(ok2 == 0){
            lo = mid + 1;
        }
    }
}

bool cmp1(info2 x, info2 y){
    return(x.x < y.x);
}
bool cmp2(info2 x, info2 y){
    return(x.y < y.y);
}
int main()
{
    f >> n >> l;
    for(int i = 1; i <= n; ++i){
        f >> a[i].x >> a[i].y; a[i].ind = i;
        b[i].x = a[i].x; b[i].y = a[i].y; b[i].ind = i;
    }
    sort(a + 1, a + 1 + n,cmp1);
    sort(b + 1, b + 1 + n,cmp2);
    cautbin(1,INF);
    return 0;
}