2442: [Usaco2011 Open]修剪草坪

来源:互联网 发布:软件测试费用多少 编辑:程序博客网 时间:2024/04/28 13:49

题目链接

题目大意:n个数,不能连续选取相邻的k+1个,求选出的数的最大和

题解:直接搞不太好优化,转化成某初赛题烽火传递
f[i]iimin,f[i]=f[j]+a[i],jik1

我的收获:……

#include <iostream>#include <cstdio>using namespace std;const int M=1000005;#define INF 1e18long long n,k,l,r,ans=INF,sum;long long a[M],q[M<<1],f[M];void work(){    for(int i=1;i<=n;i++){        while(l<r&&i-q[l]>k+1) l++;        f[i]=f[q[l]]+a[i];        while(l<r&&f[q[r]]>f[i]) r--;         q[++r]=i;    }    for(int i=n-k;i<=n;i++)        ans=min(ans,f[i]);    cout<<sum-ans<<endl; }void init(){    cin>>n>>k;    for(int i=1;i<=n;i++)        scanf("%d",&a[i]),sum+=a[i];}int main(){    init();    work();    return 0;} 
原创粉丝点击