有n个怪兽,初始攻击力为x,打n次,打完一次x-1,第一次攻击哪只怪兽可以随便选择,除了第一次攻击,只能攻击已被攻击的怪兽的相邻怪兽(随机打),求最坏情况下能消灭所有怪兽的x最小值

这篇文章介绍了如何使用C++解决一个关于怪兽战斗的问题,通过计算攻击顺序的最优策略,找到最少的攻击力要求。利用前缀和后缀最大值动态规划求解攻击序列的瓶颈。

题目

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 1e6 + 5;
int a[maxn], l[maxn], r[maxn], pre_max[maxn], suf_max[maxn], m, n;
bool mp[105];
void solve(){
	int k;
	int x;
	cin >> n;
	int minn = 1e18;
	for(int i = 1; i <= n; i++){
		cin >> a[i];
		l[i] = a[i] + i - 1;//l[i]表示打完i左边所有怪兽再打i所需的最少攻击力
		r[i] = a[i] + n - i;//r[i]表示打完i右边所有怪兽再打i所需的最少攻击力
	}
	for(int i = 1; i <= n; i++){
		pre_max[i] = max(pre_max[i - 1], r[i]);//r的前缀最大值
	}
	for(int i = n; i >= 1; i--){
		suf_max[i] = max(suf_max[i + 1], l[i]);//l的后缀最大值
	}
	for(int i = 1; i <= n; i++){//枚举第一次攻击的怪兽
		int tmp = max({a[i], pre_max[i - 1], suf_max[i + 1]});//瓶颈是当前怪兽,或者是左边的怪兽(打完它右边所有的怪兽再打它),或者是右边的怪兽
		minn = min(minn, tmp);
	}
	cout << minn << '\n';
	/*
	6
	1 1 1 6 1 1
	*/
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	int T = 1;
	//cin >> T;
	while(T--){
		solve();
	}
	return 0;
}

[CSP-S 2024 T1] 决斗 暂无标签 时间限制: 1000MS空间限制: 256MB 难度:入门 题目描述 今天是小 Q 的生日,他得到了 n 张卡牌作为礼物。这些卡牌属于火爆的“决斗怪兽”,其中,第 i 张卡代表一只攻击力为 r i ​ ,防御力也为 r i ​ 的怪兽。 一场游戏分为若干回合。每回合,小 Q 会选择某只怪兽 i 以及另一只怪兽 j(i  =j),并让怪兽 i 向怪兽 j 发起攻击。此时,若怪兽 i 的攻击力小于等于怪兽 j 的防御力,则无事发生;否则,怪兽 j 的防御被打破,怪兽 j 退出游戏不再参与到剩下的游戏中。一只怪兽在整场游戏中至多只能发起一次攻击。当未退出游戏的怪兽都已发起过攻击时,游戏结束。 小 Q 希望决定一组攻击顺序,使得在游戏结束时,未退出游戏的怪兽数量尽可能少。 输入格式 输入的第一行包含一个正整数 n,表示卡牌的个数。 输入的第二行包含 n 个正整数,其中第 i 个正整数表示第 i 个怪兽攻击力及防御力 r i ​ 。 输出格式 输出一行包含一个整数表示游戏结束时未退出游戏的怪兽数量的最小值。 样例输入 1 5 1 2 3 1 2 样例输出 1 2 样例输入 2 10 136 136 136 2417 136 136 2417 136 136 136 样例输出 2 8 提示/说明 样例解释 样例一:其中一种最优方案为:第一回合让第 2 只怪兽向第 1怪兽发起攻击,第二回合让第 5 只怪兽向第 4 只怪兽发起攻击,第三回合让第 3 只怪兽向第 5 只怪兽发起攻击。此时没有退出游戏的怪兽都进行过攻击,游戏结束。可以证明没有更优的攻击顺序。 数据范围 对于所有测试数据,保证:1≤n≤10 5 ,1≤r i ​ ≤10 5 。 测试点 n r i ​ 特殊性质 1∼4 ≤10 ≤10 5 无特殊性质 5∼10 ≤10 5 ≤2 无特殊性质 1115 ≤30 ≤10 5 特殊性质 A 16∼20 ≤10 5 ≤10 5 无特殊性质 特殊性质 A:保证每个 r i ​ 在可能的值域中独立均匀随机生成。
10-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

__night_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值