Cod sursa(job #755218)

Utilizator vendettaSalajan Razvan vendetta Data 5 iunie 2012 00:40:25
Problema Garaj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <iostream>
#include <algorithm>
#include <fstream>

using namespace std;

#define nmax 100005

ifstream f("garaj.in");
ofstream g("garaj.out");

int n, k;
typedef struct{
    int c, t;
}camp;
camp a[nmax];
int t_min;

void citeste(){

    f >> n >> k;
    for(int i=1; i<=n; i++){
        f >> a[i].c >> a[i].t;
        a[i].t = a[i].t * 2;
    }

}

bool check(int T){

    int sum = 0;

    for(int i=1; i<=n; i++){//i`au fiecare camion
        int x = T / a[i].t;//de cate ori poate merge in timpul T
        int val = x * a[i].c;//cat poate duce maxim in timpul T
        sum += val;
        if (sum >= k) return 1;
    }

    return 0;

}

bool cmp(camp A, camp B){

    return A.c > B.c;

}

void rezolva(){

    int st = 0;
    int dr = (1<<29);
    int sol = 0;

    while(st <= dr){
        int mij = (st + dr) / 2;
        if (check(mij)){
            sol = mij;
            dr = mij-1;
        }else st = mij + 1;
    }

    t_min = sol;

    for(int i=1; i<=n; i++) a[i].c = (t_min / a[i].t) * a[i].c;

    sort(a+1, a+n+1, cmp);

    //for(int i=1; i<=n; i++) cout << a[i].c << " " << a[i].t << "\n";

    int sum = 0;
    int cnt = 0;
    for(int i=1; i<=n; i++){
        sum += a[i].c;
        ++cnt;
        if (sum >= k) break;
    }

    cout << t_min << " " << cnt << "\n";
    g << t_min << " " << cnt << "\n";

}

int main(){

    citeste();
    rezolva();

    f.close();
    g.close();

    return 0;

}