Pagini recente » Cod sursa (job #2398413) | Cod sursa (job #2010304) | Cod sursa (job #3279440) | Cod sursa (job #3039247) | Cod sursa (job #1571668)
#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;
}