Pagini recente » Cod sursa (job #353507) | Rating Paraschiv Theodor Vlad (TheodorVlad) | Cod sursa (job #2308607) | Cod sursa (job #1992325) | Cod sursa (job #1572795)
#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;sticle<m && i<=n;i++)
sticle+=(timp/w[i])*v[i];
if (sticle>=m)
// ma incadrez
return 1;
else
return 0;
// nu ma incadrez
}
char s[1000001];
int main()
{
FILE *fin=fopen ("garaj.in","r");
FILE *fout=fopen ("garaj.out","w");
fscanf (fin,"%d%d\n",&n,&m);
mini=2000000000000000LL;
fread(s, 1, 1000000, fin);
int val = 0, p = 0;
i = 0;
for (int k=0; s[k]!=0; k++) {
if (s[k] >= '0' && s[k] <= '9') {
val = val * 10 + s[k] - '0';
} else {
if (s[k-1] >= '0' && s[k-1] <= '9') {
if (p == 0) {
i++;
v[i] = val;
val = 0;
p = 1;
} else {
w[i] = val;
val = 0;
p = 0;
}
}
}
}
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;
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;
}