Cod sursa(job #1575686)

Utilizator mariusn01Marius Nicoli mariusn01 Data 21 ianuarie 2016 18:36:48
Problema Garaj Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <cstdio>
#include <algorithm>
#define INF 2000000000000LL
#define lint long long
using namespace std;

int n, m, i, T[100010], C[100010];
lint timp, timpst, timpdr, t[100010];
char s[1000010];

lint numar(lint timp) {
    // se da timp si sa aflu numarul maxim de sticle de transportat in timp
    lint nr = 0;
    for (i=1;i<=n;i++) {
        nr = nr + timp/T[i]*C[i];
    }
    return nr;
}

int main () {

    FILE *fin  = fopen("garaj.in", "r");
    FILE *fout = fopen("garaj.out", "w");

    fscanf(fin,"%d%d\n",&n,&m);

// ia din fisierul fin maxim 1000010 de componente de 1 octet
// si le pune in tabloul s
    fread(s, 1, 1000010, fin);
    int val = 0;
    int p = 0;
    int k = 0;
    for (i=0;s[i]!=0;i++) {
        if (s[i] >= '0' && s[i] <= '9') {
            val = val * 10 + s[i] - '0';
        } else
            if (s[i-1] >= '0' && s[i-1] <= '9') {
                // am obtinut un nou numar in val
                if (p == 0) {
                    k++;
                    C[k] = val;
                    p = 1;
                } else {
                    T[k] = 2*val;
                    p = 0;
                }
                val = 0;
            }
    }
    if (val != 0)
        T[k] = 2*val;



//    for (i=1;i<=n;i++) {
//        fscanf(fin,"%lld%lld",&C[i],&T[i]);
//        T[i] *= 2;
//    }

    timpst = 1;
    timpdr = INF;

    while (timpst <= timpdr) {
        timp = (timpst + timpdr)/2;
        if (numar(timp) < m)
            timpst = timp + 1;
        else
            timpdr = timp - 1;
    }

    // cu acest timp minim gasit sa alegem un numar minim de camioane
    for (i=1;i<=n;i++)
        t[i] = timpst/T[i]*C[i];

    sort(t+1, t+n+1);
    i = n;
    while (m>=0) {
        m -= t[i];
        if (m <= 0)
            break;
        i--;
    }

    fprintf(fout, "%lld %d\n",timpst, n-i+1);
    return 0;
}