D. Yet Another Monster Fight
1.C. Insert and Equalize2.C. Removal of Unattractive Pairs3.D. Jumping Through Segments4.E. Good Triples5.F. Shift and Reverse
6.D. Yet Another Monster Fight
7.A. Constructive Problems8.C. Game with Multiset9.A. Rating Increase10.B. Swap and Delete11.A. Problemsolving Log12.B. Preparing for the Contest13.C. Quests14.D. Three Activities15.E2. Game with Marbles (Hard Version)16.cf刷题有感17.A. Anonymous Informant18.A. Forked!19.B. Make Almost Equal With Mod20.C. Heavy Intervals21.D. Split Plus K22.A. 202323.B. Two Divisors24.C. Training Before the Olympiad25.D. Mathematical Problem26.F. Greetings27.C. Partitioning the Array28.G. Bicycles29.E. Eat the Chip30.G. Lights31.D. Array Repetition32.D. Berserk Monsters33.E. Increasing Subsequences34.D. Very Different Array35.G. Mischievous Shooter36.B. Plus-Minus Split37.B. A Balanced Problemset38.C. Did We Get Everything Covered39.D. Find the Different Ones!40.C. Grouping Increases41.D. Good Trip42.C. Physical Education Lesson43.E. Final Countdown44.D. Divisible Pairs45.G. Vlad and Trouble at MIT46.A. Brick Wall47.B. Minimize Inversions48.C. XOR-distance49.A. Moving Chips50.B. Monsters Attack!51.C. Find B52.D. Slimes53.C. Turtle Fingers: Count the Values of k54.D. Turtle Tenacity: Continual Mods55.D. Vlad and Division56.C. LR-remainders57.D. Lonely Mountain Dungeons1.导论
这道题能不能用贪心做?答案是不能,具体为什么已经有题解给出回答。当贪心无法求解时,我们考虑一下动态规划。
2.算法设计
对于任一节点,其最坏情况(即所需最大起始威力值,后文称最大值)是什么?
当第一个被攻击的怪物(以下称头怪物)在其右边时,其最大值为右边怪物的数量加上自身初始值,头怪物在左边时同理。
因此我们可以考虑
3.算法改进
遗憾的是,n最大达到了
我们发现,任一节点的最大值是由它和头怪物的位置关系决定的。
假设
状态转移方程为:
4.代码呈现
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll a[300005]={0};//代表每个元素的初始值
ll l[300005]={0};//假如头怪物在左边的最坏情况,即左边所有怪物都清空了闪电才劈过来
ll r[300005]={0};
ll l1[300005]={0};//当前怪物为头怪物时,左边的最大值
ll r1[300005]={0};
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
l[i]=a[i]+i-1;
r[i]=a[i]+n-i;
}
ll ans=3e9;
for(int i=1;i<=n;i++) l1[i]=max(l1[i-1],r[i-1]);//由于头怪物在他们的右方,所以左边怪物的最大值等于把右边怪物都清空后的最坏情况
for(int i=n;i>=1;i--) r1[i]=max(r1[i+1],l[i+1]);
for(int i=1;i<=n;i++) ans=min(ans,max(max(l1[i],r1[i]),a[i]));//左边最大值,右边最大值,和自己
cout<<ans;
return 0;
}
合集:
codeforces
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报