P10087 [ROIR 2022 Day 1] 跳跃机器人 题解
写了半个小时,我是 fw 吗。
先假设从第一个点出发。机器人从第
但是,题目要我们自己选择一个出发点。如果直接枚举每个出发点,程序是
可以把从第
设
写代码的时候注意数据范围和时空限制。首先,数组不能开 long long;其次,在 long long;接着,区分哪里用 min,哪里用 max;然后,还要注意定的 -inf 要足够小(但不能太小);最后,别输出反了。
#include<bits/stdc++.h>
using namespace std;
int d[11451919],l[11451919],r[11451919],L[11451919],R[11451919];
int main(){
ios::sync_with_stdio(0);cin.tie(0);
int n;cin>>n;
int f;cin>>f;
if(f==1){
for(int i=1;i<=n;i++)cin>>d[i];
}else{
int m,x,y,z;cin>>m>>x>>y>>z;
for(int i=1;i<=m;i++)cin>>d[i];
for(int i=m+1;i<=n;i++)d[i]=(1ll*x*d[i-2]+1ll*y*d[i-1]+z)%1000000000+1;
}
for(int i=1;i<=n;i++){
l[i]=d[i]-n-i;
r[i]=d[i]-i;
}
L[0]=-0x7cff0102;
for(int x=1;x<=n;x++){
L[x]=max(L[x-1],l[x]);
}
R[n+1]=-0x7cff0102;
for(int x=n;x>=1;x--){
R[x]=max(R[x+1],r[x]);
}
int mn=0x7cff0102,pos=0xcff0102;
for(int x=1;x<=n;x++){
int t=max(L[x-1],R[x])+x;
if(t<mn){
pos=x;
mn=t;
}
}
cout<<mn<<" "<<pos;
return 0;
}