Cod sursa(job #1571668)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 18 ianuarie 2016 12:27:02
Problema Garaj Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <cstdio>
#include <algorithm>
using namespace std;
int v[100000],w[100000];
int verifincad (int v[],int w[],int timp,int m,int n){
    int sticle,i;
    sticle=0;
    for (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");
    int n,m,mini,i,st,ok,dr,drm,mid,timp,u,p,aux,cam,maxi,sticle;
    fscanf (fin,"%d%d",&n,&m);
    mini=2000000000;
    for (i=1;i<=n;i++){
        fscanf (fin,"%d%d",&v[i],&w[i]);
        w[i]*=2;
        st=0;
        if (m%w[i]==0) st=1;
        drm=(m/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;
    dr=mini/2;
    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 (v,w,timp,m,n);
        if (ok==0)
            st=mid+1;
        else dr=mid-1;
    }
    timp=st*2;
    fprintf (fout,"%d",timp);
    // am gasit timpul necesar
    for (i=1;i<=n;i++)
        v[i]=(timp/w[i])*v[i];
        for (u=n;u>1;u--) {
          maxi=v[1];
          p=1;
          for (i=2;i<=u;i++)
            if (v[i]>maxi) {
              maxi=v[i];
              p=i;
            }
          v[p]=v[u];
          v[u]=maxi;
        }
    sticle=0;
    i=n;
    cam=0;
    while (i>0 && sticle<m){
        sticle+=v[i];
        printf ("%d ",sticle);
        cam++;
        i--;
    }
    fprintf (fout," %d",cam);
    return 0;
}