Cod sursa(job #841185)

Utilizator stoicatheoFlirk Navok stoicatheo Data 23 decembrie 2012 21:24:00
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include<stdio.h>
#include<math.h>
#include<algorithm>
 
using namespace std;
 
int n, cnt, i, rezultat;
struct ches{
    int a, b, c, i;
};
ches v[105], sol[105], s1[105];
 
inline int cmp(ches a, ches b){
    return a.c < b.c;
}
int check(int val){
    int st[105] = {0}, i, rs = cnt, x;
 
    for (i = 1; i <= n; i ++)
        s1[i].a = 0, s1[i].b = 0;
 
    for (i = 1; i <= n; i ++){
        x = min(val, rs*v[i].a);
        rs -= x / v[i].a;
 
        st[i] = x / v[i].a * v[i].a;
        s1[v[i].i].a = x / v[i].a;
        //printf("mai avem %d lapte, cu %d in momentul %d, x fiind %d\n", rs, st[i], i, x);
        if (rs <= 0)
            break;
    }
 
    if (rs > 0)
        return 0;
 
    rs = cnt;
    for (i = n; i; i --){
        x = min(val, rs*v[i].b);
        rs -= x / v[i].b;
 
        s1[v[i].i].b = x / v[i].b;
        if (st[i] + x / v[i].b * v[i].b > val)
            return 0;
 
        if (rs <= 0)
            break;
    }
 
    if (rs > 0)
        return 0;
    return 1;
}
int bs(){
    int li = 1, ls = 100, x, gs = 0;
 
    while (li <= ls){
        x = (li+ls) / 2;
 
        if (check(x)){
            gs = x;
            for (int i = 1; i <= n; i ++)
                sol[i].a = s1[i].a, sol[i].b = s1[i].b;
 
            ls = x-1;
        }
        else
            li = x+1;
    }
 
    return gs;
}
int main()
{
    freopen("lapte.in", "rt", stdin);
    freopen("lapte.out", "wt", stdout);
 
    scanf("%d%d", &n, &cnt);
    for (i = 1; i <= n; i ++){
        scanf("%d%d", &v[i].a, &v[i].b);
        v[i].c = v[i].a - v[i].b;
        v[i].i = i;
    }
 
    sort(v+1, v+n+1, cmp);
 
    //rezultat = bs();
    for (i = 1; i <= 100; i ++){
        //printf("\nPENTRUL TIMPUL %d\n", i);
        if (check(i)){
            rezultat = i;
            for (int j = 1; j <= n; j ++)
                sol[j].a = s1[j].a, sol[j].b = s1[j].b;
            break;
        }
    }
    printf("%d\n", rezultat);
    for (i = 1; i <= n; i ++)
        printf("%d %d\n", sol[i].a, sol[i].b);
 
    return 0;
}