Cod sursa(job #1536769)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 26 noiembrie 2015 17:27:51
Problema Garaj Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include<cstdio>
#include<algorithm>
#include<cstring>
#define DIM 100000
using namespace std;
int n, m, i, ii;
long long p, u, mid, sum, r[100005];
int c[100005], t[100005];
char s[DIM + 5];
FILE * fin = fopen("garaj.in", "r");
FILE * fout = fopen("garaj.out", "w");
int f(long long mid){
    int i;
    long long sum = 0;
    for(i = 1; i <= n; i++){
        sum = sum + (mid / t[i]) * 1LL * c[i];
    }
    if(sum >= m){
        return 1;
    }
    return 0;
}

int numar(){
    while(s[ii] < '0' || s[ii] > '9'){
        ii++;
        if(ii == DIM){
            ii = 0;
            fread(s, 1, DIM, fin);
        }
    }
    int x = 0;
    while(s[ii] >= '0' && s[ii] <= '9'){
        x = x * 10 + s[ii] - '0';
        ii++;
        if(ii == DIM){
            ii = 0;
            fread(s, 1, DIM, fin);
        }
    }
    return x;
}
int main(){
    fread(s, 1, DIM, fin);
    ii = 0;
    n = numar();
    m = numar();
    p = 1;
    u = 1000000000000LL;
    for(i = 1; i <= n; i++){
        c[i] = numar();
        t[i] = numar();
        t[i] *= 2;
        //u = min(u, t[i] * 1LL * m / c[i] + t[i]);
    }
    while(p <= u){
        mid = (p + u) / 2;
        if(f(mid)){
            u = mid - 1;
        }
        else{
            p = mid + 1;
        }
    }
    fprintf(fout, "%d ", p);
    for(i = 1; i <= n; i++){
        r[i] = (p / t[i]) * 1LL * c[i];
    }
    sort(r + 1, r + n + 1);
    for(i = n; i >= 1; i--){
        sum += r[i];
        if(sum >= m){
            fprintf(fout, "%d\n", n - i + 1);
            break;
        }
    }
    return 0;
}