NC50530. 修剪草坪
描述
输入描述
第一行:空格隔开的两个整数N和K;
第二到N+1行:第i+1行有一个整数。
输出描述
一行一个值,表示FJ可以得到的最大的效率值。
示例1
输入:
5 2 1 2 3 4 5
输出:
12
说明:
FJ有5只奶牛,他们的效率为1,2,3,4,5。他们希望选取效率总和最大的奶牛,但是他不能选取超过2只连续的奶牛。FJ选择出了第三只以外的其他奶牛,总的效率为1+2+4+5=12。C++(g++ 7.5.0) 解法, 执行用时: 25ms, 内存消耗: 3492K, 提交时间: 2023-03-17 17:00:24
#include<bits/stdc++.h> #define int long long using namespace std; const int N=1e5+10; int n,k; int a[N],f[N],sum[N],d[N],q[N]; signed main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n>>k; int head=1,tail=1; for(int i=1;i<=n;++i){ cin>>a[i]; sum[i]=sum[i-1]+a[i]; d[i]=f[i-1]-sum[i]; while(head<=tail&&d[q[tail]]<d[i]) tail--; q[++tail]=i; while(head<=tail&&i-k>q[head]) head++; f[i]=sum[i]+d[q[head]]; } cout<<f[n]; return 0; }
C++(clang++ 11.0.1) 解法, 执行用时: 45ms, 内存消耗: 1924K, 提交时间: 2023-03-29 21:34:28
#include<iostream> using namespace std; const int N=1e5+10; #define ll long long ll s[N],q[N],dp[N]; ll g(ll x) { return dp[x-1]-s[x]; } int main() { int n,k; cin>>n>>k; for(int i=1;i<=n;i++) cin>>s[i],s[i]+=s[i-1]; int h=0,t=0; for(int i=1;i<=n;i++) { if(q[h]<i-k)h++; dp[i]=max(dp[i-1],g(q[h])+s[i]); while(h<=t&&g(q[t])<g(i))t--; q[++t]=i; } cout<<dp[n]; return 0; }