杭电多校 故障机器人想活下去 优先队列+贪心

原题:CAUC-OJ-故障机器人想活下去HDOJ-故障机器人想活下去

参考思路:CSDN博客

总结:按序列依次受伤害、减生命值,并同时将伤害序列推入优先队列。当生命值为负值时,进行循环:对当前伤害序列中伤害值最大的那次伤害使用烟雾弹(改写历史),并重新加回对应的生命值,直至:生命值大于零,或烟雾弹不够,或优先队列排空。若循环后生命值仍小于零,则输出i,表示除当前回合的前i回合可存活,本回合不可存活。若上述过程结束机器人的生命值仍为正,则输出总敌人数n。

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+1;
int a[N], b[N];
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin >> t;
	while(t--) {
		int n,x,k;
		cin >> n >> x >> k;		
		for (int i = 0; i < n; ++ i) {
			cin >> b[i];
			a[i] = b[i];
		}
		if (k >= n) {
			cout << n << endl;
			continue;
		}
		priority_queue <int> q;
		int f = 0;
		for (int i = 0; i < n; ++ i) {
			q.push(b[i]);
			x -= a[i];
			if (x <= 0 && k > 0) {
				while (x <= 0 && k > 0 && !q.empty()) {
					x += q.top();
					q.pop();
					k--;
				}
			}
			if (x <= 0) {
				f = 1;
				cout << i << endl;
				break;
			}
		}
		if (!f) {
			cout << n << endl;
		}
	}
	return 0;
}
// 1  1  2  3  4  4  6 9 10 12
// 19 18 16 13 9  5        
// 6  12  9 4  10 1 3 4 2 1
// 14 --  - 10 -- 9 6 2 
全部评论

相关推荐

04-25 19:29
已编辑
宁波大学 运营
被普调的六边形战士很高大:你我美牛孩
点赞 评论 收藏
分享
求面试求offer啊啊啊啊:1600一个月?
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务