本文主要是介绍Codeforce Monsters Attack!(B题 前缀和),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目描述:
思路:
本人第一次的想法是先杀血量低的
第二次想法是先搞坐标近的
第三次想法看到数据量这么大, 我先加个和看看貌似我先打谁都行,由此综合一下,我们可以把每一个不同的坐标当作一轮从最小的坐标开始,只要在当前轮数下,打死最靠近人物的怪物才行,每一轮以此类推。
说明所有F轮之前包括F轮能够攻击到角色的生命怪物血量值加起来<= F * k才行。
AC代码:
#include<iostream>
#include<cstring>using namespace std;typedef long long LL;
const int N = 1e6;//怪物的坐标和血量
struct Mtr
{int a,x;
};int main()
{cin.tie(nullptr)->ios::sync_with_stdio(false);int t;cin >> t;while(t--){bool flag = true;LL n,k;cin >> n >> k;Mtr arr[n] = {0}; //记录怪物的血量和坐标数组 LL s[n+1] = {0}; //前缀和数组 for(int i=0;i<n;i++){cin >> arr[i].a;} for(int i=0;i<n;i++){cin >> arr[i].x;if(arr[i].x < 0) arr[i].x = -arr[i].x;s[arr[i].x] += arr[i].a; }//求怪物血量的前缀和 for(int i=1;i<=n;i++){s[i] += s[i-1];}for(int i=1;i<=n;i++){if(s[i] > i*k){flag = false;break;}}if(flag) cout << "YES" << endl;else cout << "NO" << endl; }return 0;
}
建议还是手动模拟一遍,更好理解~
注意:不可以直接拿最后一轮去比,例如:第一轮1个,第二轮100个,第三轮一个,第四轮一个,第五轮1一个每轮射30个子弹。直接算第五轮你会发现存活,但是你算第二轮会发现死了。
这篇关于Codeforce Monsters Attack!(B题 前缀和)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!