【COGS1384】鱼儿仪仗队
【题目描述】
Jzyz的池塘里有很多条鱼,鱼儿们现在决定组成一个仪仗队。现在备选的N(1 <= N <= 100,000)条鱼排成了一条直线,并且按照亲近关系排的队伍,鱼儿的顺序不能改变,现在知道每条鱼的魅力值是Xi(0 <=Xi <= 1,000,000,000)。
挑选仪仗队的任务交给了小x手里(小x并不是鱼),小x发现,如果连续的挑选超过K条鱼,那么这些鱼因为关系太好,结成小团队,影响仪仗队的团结。
所以,小x挑选仪仗队的唯一原则是不能连续挑选超过K条鱼,现在小x想知道,组成仪仗队的鱼儿的最大的魅力值之和是多少。
【输入格式】
第一行:两个整数N和K
接下来N行,每行一个整数Xi,表示第i条鱼的魅力值。
【输出格式】
一个整数,表示仪仗队最大的魅力值之和。
【分析】
一道简单的单调队列,不解释了。
1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cmath> 5 #include <cstdio> 6 const int maxn=100010; 7 using namespace std; 8 long long Q[maxn],shu[maxn]; 9 long long f[maxn],n,k; 10 int main() 11 { 12 long long i,lj=0; 13 memset(f,0,sizeof(f)); 14 15 scanf("%lld%lld",&n,&k); 16 for (i=1;i<=n;i++) {scanf("%lld",&shu[i]);lj+=shu[i];} 17 int front=1,rear=1; 18 for (i=1;i<=(n+1);i++) 19 { 20 while (front<rear && (i-Q[front]-1)>k) front++; 21 if (i-1<=k) f[i]=min(shu[i],f[Q[front]]+shu[i]); 22 else f[i]=f[Q[front]]+shu[i]; 23 while (front<rear && f[i]<f[Q[rear]]) rear--; 24 Q[++rear]=i; 25 } 26 printf("%lld",lj-f[n+1]); 27 return 0; 28 }