Cod sursa(job #1393939)

Utilizator EpictetStamatin Cristian Epictet Data 19 martie 2015 21:17:12
Problema Garaj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <fstream>
#include <algorithm>
#define DIM 8192
using namespace std;
ifstream fin ("garaj.in");
ofstream fout ("garaj.out");
typedef struct { int c, t; } art;
int N, M;
unsigned int S[100010];
art V[100010];
char P[DIM + 16], *now;

unsigned int Verif(long long timp)
{
    long long v = 0;
    for (int i = 1; i <= N; i++) {
        v += timp / V[i].t * V[i].c;
        if (v > M) return M + 1;
    }
    return v;
}

void Verif()
{
    if (*now == NULL)
    {
        fin.get(P, DIM, '\0');
        now = P;
    }
}

int Get_Num()
{
    while (*now < '0' || *now > '9')
    {
        now++;
        Verif();
    }
    int number = 0;
    while (*now >= '0' && *now <= '9')
    {
        number = number * 10 + *now - '0';
        now++;
        Verif();
    }
    return number;
}

int main()
{
    now = P;
    Verif();
    N = Get_Num();
    M = Get_Num();
    for (int i = 1; i <= N; i++)
    {
        V[i].c = Get_Num();
        V[i].t = Get_Num();
        V[i].t *= 2;
    }

    long long st = 1, dr = (1LL << 60), mij, cmin, tmin;
    while (st <= dr)
    {
        mij = (st + dr) / 2;
        cmin = Verif(mij);
        if (cmin < M) st = mij + 1;
        else if (cmin > M) dr = mij - 1, tmin = mij;
        else tmin = mij, st = dr + 1;
    }

    fout << tmin << ' ';

    for (int i = 1; i <= N; i++) {
        S[i] = tmin / V[i].t * V[i].c;
    }

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

    int val = 0;
    for (int i = N; i >= 1; i--)
    {
        val += S[i];
        if (val >= M)
        {
            fout << N - i + 1 << '\n';
            break;
        }
    }

    fout.close();
    return 0;
}