Cod sursa(job #1005913)

Utilizator poptibiPop Tiberiu poptibi Data 5 octombrie 2013 23:56:36
Problema Garaj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <algorithm>
using namespace std;

const int NMAX = 100010;

int N, M, C[NMAX], T[NMAX], V[NMAX];

bool Check(int MaxTime)
{
    int Total = 0;
    for(int i = 1; i <= N; ++ i)
    {
        Total += C[i] * (MaxTime / (2 * T[i]));
        if(Total >= M)
            return 1;
    }
    return 0;
}

void Search()
{
    int Left = 0, Right = 100000000, Mid, Ans, Time;
    while(Left <= Right)
    {
        Mid = (Left + Right) / 2;
        if(Check(Mid)) Ans = Mid, Right = Mid - 1;
        else Left = Mid + 1;
    }

    for(int i = 1; i <= N; ++ i)
        V[i] = C[i] * (Ans / (2 * T[i]));

    sort(V + 1, V + N + 1);

    int Total = 0;
    for(int i = N; i >= 1; -- i)
    {
        Total += V[i];
        if(Total >= M)
        {
            Time = i;
            break;
        }
    }
    printf("%i %i\n", Ans, Time);
}

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

    scanf("%i %i", &N, &M);
    for(int i = 1; i <= N; ++ i)
        scanf("%i %i", &C[i], &T[i]);

    Search();

    return 0;
}