Cod sursa(job #132259)

Utilizator astronomyAirinei Adrian astronomy Data 5 februarie 2008 15:31:55
Problema Garaj Scor Ascuns
Compilator cpp Status done
Runda Marime 1.17 kb
#include <stdio.h>
#include <string.h>
#include <vector>
#include <algorithm>
using namespace std;

#define pb push_back
#define mp make_pair
#define PII pair<int, int>
#define llong long long

int N, M;
vector< PII > A;
vector<llong> B;

int baga(int T)
{
    int i; llong s = 0;
    for(i = N-1; i >= 0; i--)
    {
        s += ((llong)T/(2*A[i].second))*(llong)A[i].first;
        if(s >= (llong)M) return 1;
    }
    return 0;
}

void read_and_solve(void)
{
    int i, j, k, p;

    scanf("%d %d\n", &N, &M);

    for(i = 1; i <= N; i++) scanf("%d %d", &j, &k), A.pb(mp(j,k));

    for(j = 0, k = 30; k >= 0; k--)
     if( baga(j+(1<<k)) == 0 ) j += (1<<k);

    llong s = 0;
    for(i = 0; i < N; i++)
        B.pb( ((llong)(j+1)/(2*A[i].second))*(llong)A[i].first );

    sort(B.begin(), B.end());
    for(p = 0, i = N-1; i >= 0; i--)
    {
        s += B[i], p++;
        if(s >= (llong)M) break ;
    }

    printf("%d %d\n", j+1, p);
    fprintf(stderr, "%d %d\n", j+1, p);
    
}

int main(void)
{
    freopen("garaj.in", "rt", stdin);
    freopen("garaj.out", "wt", stdout);

    read_and_solve();

    return 0;
}