Cod sursa(job #1490627)

Utilizator akaprosAna Kapros akapros Data 23 septembrie 2015 21:35:09
Problema Garaj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <fstream>
#include <cstring>
#include <algorithm>
#include <string>
#define ll int
#define maxN 100002
using namespace std;
int n, sol, x;
ll m;
struct elem
{
    ll c;
    ll t;
} v[maxN];
string buffer;
string::iterator buffer_it;
ifstream fin("garaj.in");
ofstream fout("garaj.out");
int w[maxN];
void r (ll  &x )
{
    for (; *buffer_it > '9' || *buffer_it < '0'; ++ buffer_it ) ;
    for ( x = 0; *buffer_it <= '9' && *buffer_it >= '0'; ++ buffer_it )
    {
        x= x * 10 + *buffer_it - '0';
    }
}

void read()
{
    int i;
    getline( fin, buffer, (char)0 ) ;
    buffer_it = buffer.begin();
    r(n);
    r(m);
    for (i = 1; i <= n; ++ i)
        r(v[i].c), r(v[i].t),
        v[i].t *= 2;
}
bool ok(ll x)
{
    int i;
    ll sum = 0;
    for (i = 1; i <= n; ++ i)
    {
        sum += v[i].c * (x / v[i].t);
        if (sum >= m)
            break;
    }
    return sum >= m;
}
void write()
{
    int sum = 0, i, p;
    x = 0;
    for(p = 1 << 29; p; p >>= 1)
        if(!ok(x + p))
            x += p;
    ++ x;
    fout << x << " ";
    for (i = 1; i <= n; ++ i)
        w[i]=v[i].c * (x / v[i].t);

    sort(w + 1, w + n + 1);

    for (i = n; i >= 1 && sum < m; -- i)
    {
        ++ sol;
        sum += w[i];
    }

    fout << sol;
}
int main()
{
    read();
    write();
    return 0;
}