| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
送代码~#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
#define udv(a,b) ((a%b)?(a/b+1):(a/b))//向上取整除法
#define ddv(a,b) (b?(a/b):0x3f3f3f3f)//向下取整防0除法
int n,c,ans,sta=1;
int tme[25],mnc,ub[25];
struct Coin{
int v,b;
}cn[25];
bool cmp(struct Coin a,struct Coin b)
{
return a.v<b.v;
}
void init()
{
scanf("%d%d",&n,&c);
int v,b;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&v,&b);
cn[i].v=v;cn[i].b=b;
}
sort(cn+1,cn+n+1,cmp);
mnc=udv(c,cn[1].v);
for(int i=2;i<=n;i++)
tme[i]=cn[i].v/cn[i-1].v;
}
int main()
{
init();
ub[sta]=mnc;
for(int i=sta+1;i<=n;i++)
{
ub[i]=ub[i-1]/tme[i];
ub[i-1]%=tme[i];
}
while(1)
{
int d=0x3f3f3f3f;
for(int i=n;i>=sta+1;i--)
{
if(ub[i])
{
if(ub[i]>cn[i].b)
{
ub[i-1]+=(ub[i]-cn[i].b)*tme[i];
ub[i]=cn[i].b;
}
d=min(d,ddv(cn[i].b,ub[i]));
}
}
int dsta=ddv(cn[sta].b,ub[sta]);
bool flg=false;
while(ub[sta]>cn[sta].b)
{
if(sta>=n)
{
flg=true;break;
}
ub[sta+1]+=udv(ub[sta],tme[sta+1]);
sta++;
dsta=ddv(cn[sta].b,ub[sta]);
}
d=min(d,dsta);
if(flg)break;
ans+=d;
for(int i=sta;i<=n;i++)
cn[i].b-=d*ub[i];
}
printf("%d",ans);
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator