Cod sursa(job #792281)

Utilizator visanrVisan Radu visanr Data 26 septembrie 2012 20:47:49
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;


struct data
{
    int a, b, ind, ca, cb;
}V[110];

int l, N;

bool cmp1(data one, data two)
{
    return (one.a - one.b) < (two.a - two.b);
}

bool cmp2(data one, data two)
{
    return one.ind < two.ind;
}

bool Verify(int val)
{
    int a = l, b = l, i = 1, now, tp;
    while(a && i <= N)
    {
        V[i].ca = V[i].cb = 0;
        now = val / V[i].a;
        tp = val;
        tp -= min(a, now) * V[i].a;
        V[i].ca = min(a, now);
        a = (now >= a ? 0 : a - V[i].ca);
        V[i].cb = tp / V[i].b;
        b -= V[i].cb;
        i ++;
    }
    for(; i <= N; i++)
    {
        V[i].ca = V[i].cb = 0;
        V[i].cb = val / V[i].b;
        b -= V[i].cb;
    }
    if(a <= 0 && b <= 0)
        return 1;
    return 0;
}

int BS()
{
    int left = 1, right = 256, mid, ans;
    while(left <= right)
    {
        int mid = (left + right) / 2;
        if(Verify(mid))
        {
            ans = mid;
            right = mid - 1;
        }else
        {
            left = mid + 1;
        }
    }
    if(Verify(ans)) return ans;
}

int main()
{
    freopen("lapte.in", "r", stdin);
    freopen("lapte.out", "w", stdout);
    int i;
    scanf("%i %i", &N, &l);
    for(i = 1; i <= N; i++)
    {
        scanf("%i %i", &V[i].a, &V[i].b);
        V[i].ind = i;
    }
    sort(V + 1, V + N + 1, cmp1);
    printf("%i\n", BS());
    sort(V + 1, V + N + 1, cmp2);
    for(i = 1; i <= N; i++)
        printf("%i %i\n", V[i].ca, V[i].cb);
    return 0;
}