Pagini recente » Cod sursa (job #290285) | Cod sursa (job #828928) | Cod sursa (job #2220663) | Cod sursa (job #2533372) | Cod sursa (job #665189)
Cod sursa(job #665189)
#include <fstream>
using namespace std;
#define lung 100011
#define extr 30000
int t[lung],c[lung];
int times,n,m;
int co;
int sum;
int pozitionare(int st,int dr)
{
int xst,xdr;
xst=0;
xdr=-1;
while (st<dr)
if ( (times/t[dr]+1)/2*c[dr] < (times/t[st]+1)/2*c[st] )
{
st+=xst;
dr+=xdr;
}
else
{
swap(t[st],t[dr]);
swap(c[st],c[dr]);
xst=1-xst;
xdr=-1-xdr;
st+=xst;
dr+=xdr;
}
return st;
}
void quick(int st,int dr)
{
int p=pozitionare(st,dr);
if (st<p-1)
quick(st,p-1);
if (p+1<dr)
quick(p+1,dr);
}
int cautbin(int st,int dr)
{
int mij=(st+dr)/2;
int s=0;
if (st!=dr)
{
for (int i=1;i<n;++i)
if (t[i]<=mij)
s+=(mij/t[i]+1)/2*c[i];
int x;
if (s>m)
x=cautbin(st,mij);
else
if (s<m)
x=cautbin(mij+1,dr);
else x=mij;
return x;
}
else
return st;
}
void elimin(int i)
{
swap(c[i],c[co]);
swap(t[i],t[co]);
--co;
}
int main()
{
freopen("garaj.in","r",stdin);
freopen("garaj.out","w",stdout);
scanf("%d%d",&n,&m);
for (int i=1;i<=n;++i)
scanf("%d%d",&c[i],&t[i]);
times=cautbin(1,extr);
co=n;
for (int i=1;i<=n;++i)
if (t[i]>times)
elimin(i);
n=co;
quick(1,n);
for (int i=1;i<=n;++i)
sum+=(times/t[i]+1)/2*c[i];
while (sum-(times/t[n]+1)/2*c[n]>m)
{
n--;
sum-=(times/t[n]+1)/2*c[n];
}
printf("%d %d\n",times,n);
return 0;
}