题目描述:
思路:
本人第一次的想法是先杀血量低的
第二次想法是先搞坐标近的
第三次想法看到数据量这么大, 我先加个和看看貌似我先打谁都行,由此综合一下,我们可以把每一个不同的坐标当作一轮从最小的坐标开始,只要在当前轮数下,打死最靠近人物的怪物才行,每一轮以此类推。
说明所有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个子弹。直接算第五轮你会发现存活,但是你算第二轮会发现死了。