Cod sursa(job #1054430)

Utilizator TheShadowsAlexandru Cristian TheShadows Data 13 decembrie 2013 21:13:08
Problema Lapte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include<cstdio>
#include<algorithm>
using namespace std;
const int LIM = 101;
struct copil{
    int a,b,pos;
}cp[LIM];
int n,l;
bool comp(copil a, copil b){
    return a.b<b.b;
}
int bt[LIM][2];
bool canDrink(int t){
    int litria=0, litrib=0;
    for(int i=1; i<=n; i++){
        litria += t/cp[i].a;
        bt[cp[i].pos][0]=t/cp[i].a; bt[cp[i].pos][1]=0;
    }
    for(int i=1; i<=n; i++){
        if(litrib + t/cp[i].b <= l){
            litrib += t/cp[i].b;
            bt[cp[i].pos][1] += t/cp[i].b;
            litria -= t/cp[i].a;
            bt[cp[i].pos][0] -= t/cp[i].a;
        }else{
            bt[cp[i].pos][1]+=l-litrib;
            bt[cp[i].pos][0]=(t-((l-litrib)*cp[i].b))/cp[i].a;
            litria -= t/cp[i].a - bt[cp[i].pos][0];
            litrib += bt[cp[i].pos][1];

        }
    }

    if(litria>=l && litrib >= l)
        return true;
    return false;
}
int main(){
    FILE *in=fopen("lapte.in","r"), *out=fopen("lapte.out","w");
    fscanf(in, "%d%d", &n, &l);
    for(int i=1; i<=n; i++){
        fscanf(in, "%d%d", &cp[i].a, &cp[i].b);
        cp[i].pos=i;
    }
    sort(cp+1, cp+n+1, comp);

    int l1=1, l2=100, l3, b=100;
    while(l1<l2){
        l3=l1+(l2-l1)/2;
        if(canDrink(l3)){
            b=l3;
            l2=l3-1;
        }else{
            l1=l3+1;
        }
    }

    canDrink(b);
    fprintf(out, "%d\n", b);

    for(int i=1; i<=n; i++){
        fprintf(out, "%d %d\n", bt[i][0], bt[i][1]);
    }

    return 0;
}