Pagini recente » Cod sursa (job #999635) | Cod sursa (job #157737) | Cod sursa (job #2290333) | Cod sursa (job #1273277) | Cod sursa (job #1466481)
#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.
*/