Cod sursa(job #1466481)

Utilizator enedumitruene dumitru enedumitru Data 29 iulie 2015 12:07:20
Problema Garaj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include<fstream>
#include<iostream>
#include<algorithm>
using namespace std;
ifstream f("garaj.in"); ofstream g("garaj.out");
const int maxn = 100003;
const int smax = 2000000000;
struct camion {int c,t,s;} v[maxn];
int N,M,sum,T=smax,sol,i;
inline bool mycomp(camion a,camion b)
{   return a.s>b.s;}
int main()
{   f>>N>>M;
    for(i=1;i<=N;++i) {f>>v[i].c>>v[i].t; v[i].t*=2;}
    int st=1,dr=smax,mid;
    while(st<=dr)
    {   mid=(st+dr)/2; sum=0;
        for(int i=1;i<=N&&sum<M;i++) sum+=mid/v[i].t*v[i].c;
        if(sum>=M)
        {   dr=mid-1;
            if(T>mid) T=mid;
        }
        else st=mid+1;
    }
    for(i=1;i<=N;++i) v[i].s=(T/v[i].t)*v[i].c;
    sort(v+1,v+N+1,mycomp);
    sum=0;
    for(sol=1; sol<=N && sum<M ; sol++) sum+=v[sol].s;
    sol--; g<<T<<" "<<sol<<'\n';
    g.close(); return 0;
}
/*
Observam ca daca in timpul T putem termina transportul, atunci transportul poate fi terminat si la momentele de timp mai mari decat T.
 Deci putem cauta binar timpul maxim in care circula un camion. Pentru un timp T fixat, vom vedea care este numarul maxim de sticle care
  pot fi duse la adapost, daca acest numar este mai mare sau egal decat M, timpul fixat este unul valid si vom incerca sa gasim un timp mai mic,
   altfel vom incerca un timp mai mare. Dupa ce am minimizat timpul maxim in care circula un camion,
    vom sorta camioanele descrescator dupa numarul de sticle pe care il pot transporta in acest timp si vom alege pe rand cate un camion
     incepand cu primul pana cand numarul de sticle pe care il pot transporta toate camioanele alese va fi mai mare sau egal cu M.
*/