Cod sursa(job #1392873)

Utilizator Athena99Anghel Anca Athena99 Data 18 martie 2015 22:51:19
Problema Garaj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <algorithm>
#include <fstream>
#include <string>

using namespace std;

ifstream fin("garaj.in");
ofstream fout("garaj.out");

const int inf= 1<<30;
const int nmax= 100001;

string buffer;
string::iterator buffer_it;

void read_int_nn( int &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';
    }
}

int n, m;
int nr[nmax+1];

struct str {
    int c, t;
};

str v[nmax+1];

bool check( int x ) {
    int aux= 0;
    for ( int i= 1; i<=n; ++i ) {
        aux= aux+x/v[i].t*v[i].c;
        if ( aux>=m ) return 1;
    }

    return 0;
}

int main(  ) {
    getline( fin, buffer, (char)0 ) ;
    buffer_it= buffer.begin();

    read_int_nn(n), read_int_nn(m);
    for ( int i= 1; i<=n; ++i ) {
        read_int_nn(v[i].c), read_int_nn(v[i].t);
        v[i].t= 2*v[i].t;
    }

    int sol= inf, trmin= 0;
    for ( int step= inf; step>0; step/= 2 ) {
        if ( sol-step>=0 && check(sol-step)==1 ) {
            sol-= step;
        }
    }

    for ( int i= 1; i<=n; ++i ) {
        nr[i]= sol/v[i].t*v[i].c;
    }
    sort( nr+1, nr+n+1 ) ;

    for ( int i= n, sum= 0; i>=1 && sum<m; --i ) {
        ++trmin, sum+= nr[i];
    }


    fout<<sol<<" "<<trmin<<"\n";

    return 0;
}