XP05 D04
2025-08-16 11:24:00
发布于:浙江
链接描述
代码:
#include<bits/stdc++.h>
using namespace std;
int a[300005];
int f[300005][3];
int calc(int x,int y){
if(x<y){
return x+1;
}else if(x==y){
return x;
}else{
return x-1;
}
}
void solve(){
int n;
cin>>n;
memset(a,0,sizeof a);
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=0;i<=n+1;i++)f[i][0]=f[i][1]=f[i][2]=0;
//不存在f[0][1]和f[0][2]的分数。
f[0][1]=f[0][2]=INT_MIN;
for(int i=1;i<=n;i++){
f[i][0]=calc(f[i-1][0],a[i]);
f[i][1]=max(f[i-1][0],f[i-1][1]);
f[i][2]=max(calc(f[i-1][1],a[i]),calc(f[i-1][2],a[i]));
}
cout<<max(f[n][1],f[n][2])<<endl;
}
int main(){
int t;
cin>>t;
while(t--)solve();
return 0;
}
链接描述
这道题,出营地后可以进行一个详解。
现在已经22:37了,就先做一个思路的解释:
先找到点和点的第一个相交点。
然后再找出距离它们最长的线。
将所有线乘二减去距离最长的线。
这里空空如也








有帮助,赞一个