首页 > 其他分享 >[Codeforces] CF1763B Incinerate

[Codeforces] CF1763B Incinerate

时间:2023-12-09 18:55:33浏览次数:32  
标签:Incinerate int Genos Codeforces CF1763B maxn 怪物 ans now

CF1763B Incinerate

题意

为了消灭人类,怪物协会向地球表面派出了 \(n\) 只怪兽。第 \(i\) 只怪物有一个生命值 \(h_i\) 和一个攻击力 \(p_i\) .

凭借他最后的一击,真螺旋焚烧炮,Genos 可以对所有活着的怪物造成 \(k\) 点伤害。换句话说,Genos 可以通过一次攻击降低所有怪物 \(k\) 点生命值(如果 \(k>0\))。

然而,在 Genos 发动的每一次攻击之后,怪物们都会反击。在他们的共同努力下,它们通过活着的最弱的怪物的力量降低 Genos 的攻击伤害。换句话说,在每次攻击后,将\(k\)的值减去当前所有活着的怪物中的最小\(p_i\)。

最弱的怪物是力量最小的怪物。

如果怪物的生命值严格大于0,则它是活着的。

Genos 会成功杀死所有怪物吗?

思路

既然题目中已经提到了,每次都取最小的 \(p_i\) ,那很容易想到可以用优先队列进行模拟

同时,还需要将其与对应的 \(h_i\) 进行配对,可以在再其中套一层 pair

接着就直接模拟题目中的操作就好,每次都从队头依次查找没有死的最小的 \(p_i\) ,然后更新 \(k\) 为 \(k-p_i\) 即可

代码

#include<bits/stdc++.h>
using namespace std;
const int Maxn=1e5+10;
int n,k,now,ans,maxn;
int h[Maxn],p[Maxn];
void run()
{
	priority_queue<pair<int,int> >q; //first存p,second存h,默认按-p从大到小排序 
	cin>>n>>k;
    now=k;ans=1;maxn=-1e9;
	for(int i=1;i<=n;i++)
	{
		cin>>h[i];
		maxn=max(maxn,h[i]);
	}
	for(int i=1;i<=n;i++) cin>>p[i];
	for(int i=1;i<=n;i++) q.push(make_pair(-p[i],h[i]));
	while(now<maxn && k>0 && !q.empty())
    //now只要大于maxn,就一定可以杀死所有怪物
    //k小于0时,就无法对怪物造成实质性的伤害
	{
		while(!q.empty() && q.top().second<=now) q.pop(); //找到还活着的怪物的p[i]的最小值
		pair<int,int>t=q.top();
        q.pop();
		k+=t.first;
		now+=k;
		q.push(t);
	}
	while(!q.empty() && ans)//最后判断,是否全部的怪物都能被杀死
	{
		if(q.top().second>now) ans=0;
		q.pop();
	}
	cout<<(ans?"Yes":"No")<<endl;
}
int main()
{
	int t;
	cin>>t;
	while(t--) run();
}

标签:Incinerate,int,Genos,Codeforces,CF1763B,maxn,怪物,ans,now
From: https://www.cnblogs.com/lyk2010/p/17891324.html

相关文章

  • Codeforces Round 909 (Div. 3)
    https://codeforces.com/contest/1899  一个小游戏#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>usingnamespacestd;intn;intmain(){cin>>n;while(n--){intx;......
  • [Codeforces] CF1704C Virus
    CF1704CVirus题意有一个长度为\(n\)的环,即对于\(1\leqi\leqn\),满足第\(i\)个与第\(i+1\)个房子相邻,特别地,第\(n\)个房子与第\(1\)个房子也相邻。一开始,这\(n\)个房子中有\(m\)个房子被病毒感染了。在之后的每天早上,都可以选择一个未被感染的房子并对其进行保护,被保......
  • [Codeforces] CF1703E Mirror Grid
    CF1703EMirrorGrid题意给定一个\(n\timesn\(n\le100)\)的01矩形,求至少修改多少次后能使矩形旋转0°,90°,180°,270°后所形成的矩形都完全相同。思路吸纳分为两种情况讨论:\(n\)为奇数那么会出现这种情况:(以\(5\times5\)为例)如上图,我们就可以将其分为五个部分,每个......
  • Codeforces Round 811 (Div. 3)
    基本情况ABC秒了。DE都给了我希望,但都做不下去。两道题反复横跳,结果最后谁也没做出来。E还是比D亲切的,先补E吧。E.AddModulo10做的时候想着说对每个个位数的变化找找规律,但是没有进一步的发现。实际上就应该从这里下手。首先共识:相同的两个数经过操作后必然相同。分析......
  • Codeforces Round 913 (Div. 3)
    A.Rook打印出象棋车的下一步usingnamespacestd;voidsolve(){ strings; cin>>s; chara=s[0]; charb=s[1]; set<string>ans; for(chari='1';i<='8';i++){ stringt=""; t+=a; t+=i; ans.insert(t); } for(chari......
  • Codeforces Round 894 G
    玩一下样例就能知道这个是和每个seg的最大间隔相关为了好写我们可以直接写成元素间隔这样我们用两个multiset维护元素间隔以及元素即可注意删除的时候我们只删一个值需要删指针还有考虑长度为1的情况multiset<int>st,st1;voidErase(intx){autoit=st1.lower_bound......
  • Codeforces Round 913 (Div. 3)
    CodeforcesRound913(Div.3)比赛链接ROOK题目思路:我没有下过国际象棋,但这个题跟国际象棋真是没有一点关系,就是一个简单的输出代码:#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongvoidsolve(){//intn;strings;cin>>s;in......
  • CodeForces 1901F Landscaping
    洛谷传送门CF传送门还是很有趣的一道题。场上直接暴拆式子,要维护动态凸包,本来以为是\(\log^2\)的,写着写着发现是\(\log^3\),遂弃。显然梯形面积最小等价于\(y_0+y_1\)最小,而\(y_0+y_1\)最小等价于梯形在\(m=\frac{n}{2}\)处最小。把上凸包建出来,发现过\(x=m......
  • Codeforces Round 913 (Div. 3)
    CodeforcesRound913(Div.3)div3两题新纪录..我再也不喝完酒打cf了A.Rook#include<bits/stdc++.h>//#defineintlonglong#defineendl'\n'usingnamespacestd;intboard[10][10];voidsolve(){strings;cin>>s;intx=s[0]-&#......
  • 【题解】CodeForces 1902F Trees and XOR Queries Again
    传送门:https://codeforces.com/contest/1902/problem/F数据结构题,这里讲两种思路。$ST$表思路:判定“从若干个数中能否取出其中一些,使得异或和为$x$”的问题,第一时间想到线性基,本题要做的显然就是快速求出询问路径上所有数的线性基。两组数的线性基可以合并,方法为“暴力将......