CF1862F 题解

洛谷传送门 & CF 传送门

思路

这题我们可以把能量攒起来,最后把怪物一起打死。设怪物总血量为 sumsum,把能量和为 xx 的怪物都用冰打死,需要耗费 xw\lceil\frac xw\rceil 的时间;把剩下的怪物(能量和为 sumxsum-x 的怪物)都用火打死,需要耗费 sumxf\lceil\frac{sum-x}f\rceil 时间。所以我们把能量和为 xx 的怪物都用冰打死,剩下的用火打死,总共要耗费 max(xw,sumxf)\max(\lceil\frac xw\rceil,\lceil\frac{sum-x}f\rceil) 的时间。我们只要枚举每个可能的 xx 即可。

枚举每个可行的 xx,我们可以用背包问题解决。当然,为了优化常数你也可以用 bitset 进行优化。

代码

# include <bits/stdc++.h>
using namespace std;
int t, w, f, minx, a[105], sum, n;
bitset <1000005> dp;
int main () {
	cin >> t;
	while (t --) {
		cin >> w >> f >> n;
		sum = 0, minx = 1e9; //多组数据要清零
		dp.reset (); //多组数据要清空
		dp.set (0, 1); //多组数据要初始化
		for (int i = 0; i < n; ++ i)
			cin >> a[i], sum += a[i], dp |= dp << a[i]; //bitset 多方便啊
		for (int i = 0; i <= sum; ++ i)
			if (dp[i])
				minx = min (minx, max ((i + w - 1) / w, (sum - i + f - 1) / f));
		cout << minx << '\n';
	}
	return 0;
}
posted @ 2023-09-04 22:01  Vitamin_B  阅读(10)  评论(0)    收藏  举报  来源