Cod sursa(job #2065767)

Utilizator lulian23Tiganescu Iulian lulian23 Data 14 noiembrie 2017 10:20:02
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <bits/stdc++.h>
#define nmax 123

using namespace std;

struct A{
    int a, b, c, i;
};
A v[ nmax ], sol[ nmax ], s[ nmax ];

int n, vaL, R;

bool sorT(A a, A b){
    return a.c < b.c;
}

int rezolvare(int val){

    int st[ nmax ] = {0}, rs = vaL, x;

    for (int i = 1; i <= n; i++)
        s[ i ].a = s[ i ].b = 0;

    for (int 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;
        s[ v[ i ].i ].a = x / v[ i ].a;

        if (rs <= 0)
            break;
    }

    if (rs > 0)
        return 0;

    rs = vaL;

    for (int i = n; i >= 1; i--){
        x = min(val, rs * v[ i ].b);
        rs -= x / v[ i ].b;

        s[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;
    }

    return !(rs > 0);
}

int binarY(){
    int li = 1, ls = 100, gs = -1;

    while (li <= ls){

        int mid = (li + ls) / 2;

        if (rezolvare( mid )){
            gs = mid;
            for (int i = 1; i <= n; i ++)
                sol[ i ].a = s[ i ].a, sol[ i ].b = s[ i ].b;

            ls = mid - 1;
        }
        else
            li = mid + 1;
    }
    return gs;
}

int main()
{
    freopen("lapte.in", "r", stdin);
    freopen("lapte.out", "w", stdout);

    scanf("%d %d", &n, &vaL);

    for (int 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, sorT);

        R = binarY();

    printf("%d ", R);
    printf("\n");

    for (int i = 1; i <= n; i++){
        printf("%d %d",sol[ i ].a, sol[ i ].b);
        printf("\n");
    }
}