Codeforces - Incinerate
题意
一开始有n个怪兽,每个怪兽有一个血量和攻击力,现在有一个人来攻击这些怪兽,这个人的初始攻击力是k。每轮战斗后怪兽的血量都会降低人的现有攻击力,但是人的攻击力也会降低,降低值就是存活的怪兽中的最低攻击力。现在问人能不能杀死全部的怪兽。
题解
这道题,本来想使用map,key值存怪兽最低的攻击力,value值存怪兽的血量。但是map 不允许出现重复的 key值,一直出错。
为了实现能够存储重复的key值,可以使用 multiset , 再配合pair<int,int>,成功存储怪兽的攻击力和血量,并且将攻击力存入第一个值后,将按第一个值升序排列。这样我们只用从前往后遍历,是否可以杀死所以怪兽即可。
代码
#include<iostream>
#include<cstring>
#include<set>
using namespace std;
const int N = 2e5 + 5;
int h[N],p[N];
int t,n,k;
multiset<pair<int,int>>ph;
void init(){
ph.clear(); // 重置 multiset
// memset(h,0,sizeof h);
// memset(p,0,sizeof p);
cin >> n >> k;
for(int i = 1; i <= n; ++i) cin >> h[i];
for(int i = 1; i <= n; ++i) cin >> p[i];
for(int i = 1; i <= n; ++i){
ph.insert({p[i],h[i]});
}
}
void solve(){
bool flag = false; // 判断最终是否可以杀死全部的怪兽
long long ans = k;
multiset<pair<int,int>>::iterator it;
for(it = ph.begin(); it != ph.end(); ){
// it = ph.begin();
while(it -> second <= ans && it != ph.end()){ // *it 被杀死
it++;
}
k -= it -> first;
ans += k;
if(k <= 0 && it -> second > 0){
flag = true; break;
}
}
cout << (flag ? "NO" : "YES") << endl;
}
int main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> t;
while(t--){
init(); // 初始化
solve();
}
return 0;
}