以下两份代码(二分核心部分)采用了看起来都很正确的写法,结果它们都没有AC且WA了不同的点,这是为什么qaq
1号代码及提交:
int maxb=ceil(log2((long double)(s)))+5;
ans=INF;
for(int i=0;i<=maxb;++i)
{
int x=(s+(1ll<<i)-1)/(1ll<<i);
if(x==0) break;
l=0,r=S;
while(l<r)
{
int mid=(l+r)>>1;
if(dp(mid)>=x) r=mid;
else l=mid+1;
}
ans=min(ans,l*a+i*b);
}
printf("%lld\n",ans);
2号代码及提交:
int maxb=ceil(log2((long double)(s)))+5;
ans=INF;
for(int i=0;i<=maxb;++i)
{
int x=(s+(1ll<<i)-1)/(1ll<<i);
if(x==0) break;
l=0,r=S;
while(l<=r)
{
int mid=(l+r)>>1;
if(dp(mid)>=x) r=mid-1;
else l=mid+1;
}
ans=min(ans,l*a+i*b);
}
printf("%lld\n",ans);