220405总结

220405总结

T1 潜水员

和普通的01背包的不不同点在于,有两个状态需要转移:氧气量和氮气量

\(f(u,v)\) 为拥有 \(u\) 升氧气 \(v\) 升氮气所需的最小气缸重量

想到 最小 二字,自然能想到用 \(\min\) 去转移

其他的就和普通的背包相同了

\(f(u,v)=\displaystyle\min_{i=1}^k(f(u-a_i,v-b_i)+c_i)\)

T2 分组背包

裸的板子题

枚举背包编号,先确定背包限制大小,再选物品去更新

for(int i = 1;i<=T;i++){
	for(int j = V;j>=0;j--){
		for(int k = 1;k<=BAGn[i][0];k++){
			int ind = BAGn[i][k];
			if(j >= A[ind].w){
				dp[j] = max(dp[j],dp[j-A[ind].w]+A[ind].v);
			}
		}
	}
}

T3 小球

因为是一棵满二叉树,所以节点 \(i\) 的左孩子是 \(2i\) ,右孩子是 \(2i+1\)

设这棵树的高度为 \(dep\)

则所有的叶子节点的编号都在 \([2^{dep-1},2^{dep})\) 这个区间里面

模拟即可

bool tree[2000000];

leaL = 1<<(D-1);

while(I--){
	k = 1;
	while(k < leaL){
		ad = 0;
		if(tree[k]) ad = 1;
		tree[k] = !tree[k];
		k = (k << 1) | ad;
	}
	res = k;
}
printf("%d",res);
posted @ 2022-04-06 13:26  Burnling  阅读(46)  评论(0编辑  收藏  举报