Cod sursa(job #988680)

Utilizator Corneliu10Dumitru Corneliu Corneliu10 Data 23 august 2013 16:42:15
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 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;
        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);
  
    
    for (i = 1; i <= 100; 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;
}