牛客 数学考试(思维)
先求一遍前缀和,然后从n-k+1,倒序枚举,并且同时维护一个后面的最大值。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=3e5+10; priority_queue<ll> q; ll a[N]; ll s[N]; int main(){ int t; cin>>t; while(t--){ int n,k; cin>>n>>k; int i; for(i=1;i<=n;i++){ scanf("%lld",&a[i]); s[i]=s[i-1]+a[i]; } ll res=-1e18; ll tmp=-1e18; for(i=n-k+1;i>=1;i--){ if(i-k-1<0) break; tmp=max(s[i+k-1]-s[i-1],tmp); res=max(res,tmp+s[i-1]-s[i-1-k]); } cout<<res<<endl; } }
没有人不辛苦,只有人不喊疼