CF1862F

发布时间:2024年01月05日

洛谷题目链接

Codeforces题目链接

分析

观察到不管怎么打打完所有怪物的总能量是不变的,统计打完所有怪兽的能量和,记为 s u m sum sum

可以考虑一些怪物用 i i i 单位的水能量来打败,剩下的用 s u m ? i sum-i sum?i 单位的火能量来打败,产生 i i i 单位的水能量的时间为 ? i w ? \lceil\frac{i}{w}\rceil ?wi??,产生 i i i 单位的水能量的时间为 ? s u m ? i f ? \lceil\frac{sum-i}{f}\rceil ?fsum?i??

但是 i i i 单位的水能量可能打不完整数只怪兽,所以还得跑一遍背包,判断每个 i i i 是否可行,但是 dp 数组开 int 类型可能会 MLE 所以得用 bool 类型。

代码

#include <bits/stdc++.h>

using namespace std;

const int N = 100000005, M = 105;
int T, n, w, f, s[M];
bool dp[N];

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	for(cin >> T; T; T --){
		memset(dp, 0, sizeof dp);
		int sum = 0;
		cin >> w >> f >> n;
		for(int i = 1; i <= n; i ++){
			cin >> s[i];
			sum += s[i];
		}
		dp[0] = 1;
		for(int i = 1; i <= n; i ++){
			for(int j = sum; j >= s[i]; j --){
				dp[j] |= dp[j - s[i]];
			}
		}
		int minn = 1e9;
		for(int i = 0; i <= sum; i ++){
			if(dp[i]){
				int water = ceil((double)(i) / (double)(w));
				int fire = ceil((double)(sum - i) / (double)(f));
				minn = min(minn, max(water, fire));
			}
		}
		cout << minn << "\n";
	}
	return 0;
}
文章来源:https://blog.csdn.net/zc2000911/article/details/135417031
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。