Cod sursa(job #1572782)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 19 ianuarie 2016 09:29:52
Problema Garaj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <cstdio>
#include <algorithm>
using namespace std;
int v[100002],w[100002];
long long t[100002];

int n,m,i,ok,cam;
long long drm, st, dr, mid, timp, sticle, mini;


int verifincad (long long timp){
    long long sticle = 0;
    for (int i=1;i<=n && sticle<m;i++)
        sticle+=(timp/w[i])*v[i];

    if (sticle>=m)
        // ma incadrez
        return 1;
    else
        return 0;
    // nu ma incadrez
}

int main()
{
    FILE *fin=fopen ("garaj.in","r");
    FILE *fout=fopen ("garaj.out","w");
    fscanf (fin,"%d%d",&n,&m);
    mini=2000000000000000LL;
    for (i=1;i<=n;i++){
        fscanf (fin,"%d%d",&v[i],&w[i]);
        //w[i]*=2;
        //st=0;
        //if (m%v[i]==0)
            //st=1;
        //drm=(m*1LL/v[i])*w[i];
        //if (st==0)
            //drm+=w[i];
        //if (mini>drm)
            //mini=drm;
    }
    // este clar ca putem sa ne incadram cel mult in timpul mini
    st=1;
    //prlong longf ("%d",mini);
    //dr=mini/2;
    dr = 1000000;
    ok=0;
    while (st<=dr){
        mid=(st+dr)/2;
        timp=mid*2;
        // trebuie acum sa vedem daca ne putem incadra in timpul timp
        ok=verifincad (timp);
        if (ok==0)
            st=mid+1;
        else
            dr=mid-1;
    }
    timp=st*2;
    fprintf (fout,"%lld",timp);
    // am gasit timpul necesar
    for (i=1;i<=n;i++)
        t[i]=(timp/w[i])*v[i];
    sort (t+1,t+n+1);
    sticle=0;
    i=n;
    cam=0;
    while (i>0 && sticle<m){
        sticle+=t[i];
        cam++;
        i--;
    }
    fprintf (fout," %d",cam);
    return 0;
}