求助二分边界问题
查看原帖
求助二分边界问题
67952
白鲟楼主2020/5/27 19:54
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
using namespace std;
long long n,w,l,r,f[100001];
struct cow
{
	long long w,t;
}a[251];
bool check(long long x)
{
	memset(f,-0x3f,sizeof f);
	f[0]=0;
	for(long long i=1;i<=n;++i)
	{
		long long value=a[i].t-x*a[i].w;
		for(long long j=w<<1;j>=a[i].w;--j)
			f[j]=max(f[j],f[j-a[i].w]+value);
	}
	for(long long j=w<<1;j>=w;--j)
		f[w]=max(f[w],f[j]);
	return f[w]<=0;
}
signed main()
{
	scanf("%lld%lld",&n,&w);
	for(long long i=1;i<=n;r+=a[i].t*=1000,++i)
		scanf("%lld%lld",&a[i].w,&a[i].t);
	while(l<=r)
	{
		long long mid=(l+r)>>1;
		if(check(mid))
			r=mid-1;
		else l=mid+1;
	}
	printf("%lld",r);
	return 0;
}
//sum(t[i])/sum(w[i])<=ans
//ans*sum(w[i])>=sum(t[i])
//sum(t[i]-ans*w[i])<=0

这当中的二分为何边界是这样……

若写成如下形式,为何最后答案会多 11……

while(l<r)
{
	long long mid=(l+r)>>1;
	if(check(mid))
		r=mid;
	else l=mid+1;
}
2020/5/27 19:54
加载中...