B. Array Walk
题意
有n<1e5个格子每个位置有一个val>0
从1号位置跳格子每次跳到一个格子i获得格子的val[i]
可以向左或向右跳前提是不超或边界
最初有sum=val[1]
现在限制跳k次,最多不能往左跳z次且不能连续向左跳
问最大得分
题解
一定是在某两个数之间反复横跳 或者直接走到底 最大
不会这里来回跳之后在其他位置再来回跳
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| #include <bits/stdc++.h> using namespace std; typedef long long ll; #define endl '\n' #define Turnoff std::ios::sync_with_stdio(false) const ll Max=1e5+5; ll data[Max]; ll sum[Max]; int num[10];
int main() { Turnoff; int t;cin>>t; while(t--){ int n,k,z;cin>>n>>k>>z; z=min(z,k/2); for(int i=1;i<=n;i++){ cin>>data[i]; sum[i]=sum[i-1]+data[i]; } ll ans=0,last=k+1; for(int i=last;i>1;i--){ ll temp=sum[i]; int turn=last-i; int left=(turn+1)/2; if(left>z){ temp+=data[i-1]*z+data[i]*z; temp+=sum[k-2*z+1]-sum[i]; ans=max(ans,temp); } else{ temp+=data[i-1]*left+data[i]*(turn-left); ans=max(ans,temp); } } cout<<ans<<endl; } }
|