D. Yet Another Monster Fight
方法一
最大最小值问题我们很容易想到二分答案法。那么我们如何写出check函数呢?
对于答案x,若x-i+1<a[i],则选定怪物一定不在 i 位置左侧,即L=i;
若x-n+i<a[i],则选定怪物一定不在 i 位置右侧,R=min(R,i)。
遍历数组,如果L<=R则答案符合题意;否则不符合。
code
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=3e5+5; int a[N],n; int check(int x) { int l=0,r=n; for(int i=1;i<=n;i++) { if(x-a[i]+1<i) l=i; if(x-a[i]<n-i) r=min(r,i); } if(l<=r) return 1; return 0; } int main() { int maxx=-1; cin>>n; for(int i=1;i<=n;i++) cin>>a[i],maxx=max(maxx,a[i]); int l=maxx-1,r=2e9,mid; while(l+1<r) { mid=l+(r-l>>1); if(check(mid)) r=mid; else l=mid; } cout<<r; return 0; }
方法二
code
#include<bits/stdc++.h> using namespace std; const int N=3e5+5; int a[N],b[N],c[N]; int MAX(int a,int b,int c){ a=max(a,b); a=max(a,c); return a; } int main(){ int n; cin>>n; for (int i=1;i<=n;i++){ cin>>a[i]; b[i]=max(b[i-1],a[i]+n-i); } for (int i=n;i>=1;i--){ c[i]=max(c[i+1],a[i]+i-1); } int ans=2e9; for (int i=1;i<=n;i++){ ans=min(ans,MAX(a[i],b[i-1],c[i+1])); } cout<<ans; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步