hdu6804 1003 Contest of Rope Pulling 2020杭电多校

http://acm.hdu.edu.cn/showproblem.php?pid=6804

题解的方法是取T=sqrt(n+m) * 1000 * 2的容量,然后随机打乱两个集合的物品顺序,然后去更新这个有限制大小的背包,直接在[-T,T]直接更新,期望总能在这一部分碰撞找到最优解。

然而这题过了一车人,154个估计得有140个1e10暴力跑过去的,我加了一大把优化还跑步过去,反而最简单的能跑过,反向优化

#include
using namespace std;
typedef long long ll;
mt19937 rnd(time(NULL));

const int maxl=2010;
const int maxm=maxl*100,mid=maxm/2;
const ll inf=1ll<<60;

int n,m;ll ans;
struct node
{
	int t,w,v;
}a[maxl];
ll f[2][maxm];

inline void prework()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n+m;i++)
	{
		scanf("%d%d",&a[i].w,&a[i].v);	
		if(i<=n) a[i].t=1;else a[i].t=2;
	}
	shuffle(a+1,a+1+n+m,rnd);
}

inline umx(ll &x,ll y)
{
	if(x

 

你可能感兴趣的:(背包DP,玄学)