Cod sursa(job #1027423)

Utilizator R.A.RFMI Romila Remus Arthur R.A.R Data 12 noiembrie 2013 19:40:16
Problema Lapte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <fstream>
#include <algorithm>
#include <vector>

using namespace std;

ifstream in("lapte.in");
ofstream out("lapte.out");

const int NMAX = 102;

struct bautor{
    int x,y,p;
}V[NMAX], Sol[NMAX];

int N, C;

inline bool cmp(const bautor&a, const bautor&b){
    if(a.x*b.y != b.x*a.y)
        return a.x*b.y < b.x*a.y;
    else
        return a.x < b.x;
}

bool tryToDrink(int time){

    int C1 = C, C2 = C, dif, val1, val2;

    for(int i = 0; i < N; i++){
        if(C1 > 0) {
            val1 = time/V[i].x;
            C1 -= val1;
            dif = time%V[i].x;

            if(C1 < 0){
                dif += (-C1)*V[i].x;
                C1 = 0;
            }
            val2 = dif/V[i].y;
            C2 -= val2;

            Sol[V[i].p].x = val1;
            Sol[V[i].p].y = val2;
        }
        else {
            val2 = time/V[i].y;
            C2 -= val2;
            Sol[V[i].p].x = 0;
            Sol[V[i].p].y = val2;
        }
    }

    if(C1 <= 0 && C2 <= 0){
        return true;
    }
    else {
        return false;
    }

}

int searchMinValue()
{
    int i, step;
    for (step = 1; step < 10000; step <<= 1);
    for (i = 0; step; step >>= 1)
        if (i + step < 10000 && tryToDrink(i+step) == false)
           i += step;

    while(!tryToDrink(i))
        i++;
    while(tryToDrink(i))
        i--;
    return i+1;
}

int main()
{
    int i;
    in >> N >> C;

    for(i = 0; i < N; i++){
        in >> V[i].x >> V[i].y;
        V[i].p = i;
    }

    sort(V,V+N,cmp);

    out << searchMinValue() << '\n';

    for(i = 0; i < N; i++){
        out << Sol[i].x << ' ' << Sol[i].y << '\n';
    }
    return 0;
}