Cod sursa(job #1490507)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 23 septembrie 2015 18:16:46
Problema Garaj Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <cstdio>
#include <cctype>
#include <algorithm>
#define BUF_SIZE 4096
#define MAXN 100000
typedef struct{
    int c, t;
}mycreation;
mycreation v[MAXN];
int n, rez, m;
int pos=BUF_SIZE;
char buf[BUF_SIZE];
FILE *fin;
inline char getch(){
    if(pos==BUF_SIZE){
        fread(buf, BUF_SIZE, 1, fin);
        pos=0;
    }
    return buf[pos++];
}
inline int read(){
    int x=0;
    char ch=getch();
    while(!isdigit(ch)){
        ch=getch();
    }
    while(isdigit(ch)){
        x=10*x+ch-'0';
        ch=getch();
    }
    return x;
}
bool cmp(const mycreation a, const mycreation b){
    return (a.c*(long long)(rez/a.t)>b.c*(long long)(rez/b.t));
}
bool ok(int x){
    long long s=0;
    for(int i=0; i<n; i++){
        s+=v[i].c*(long long)(x/v[i].t);
        if(s>=m){
            return false;
        }
    }
    return true;
}
int main(){
    int i;
    long long pas, s;
    FILE *fout;
    fin=fopen("garaj.in", "r");
    fout=fopen("garaj.out", "w");
    n=read();
    m=read();
    for(i=0; i<n; i++){
        v[i].c=read();
        v[i].t=read();
        v[i].t*=2;
    }
    rez=-1;
    for(pas=1LL<<40; pas; pas>>=1){
        if(ok(rez+pas)){
            rez+=pas;
        }
    }
    rez++;
    std::sort(v, v+n, cmp);
    i=0;
    s=0;
    while((s<m)&&(i<n)){
        s+=v[i].c*(long long)(rez/v[i].t);
        i++;
    }
    fprintf(fout, "%d %d\n", rez, i);
    fclose(fin);
    fclose(fout);
    return 0;
}