首页 > 其他分享 >P2627 [USACO11OPEN] Mowing the Lawn G ( [USACO Open11] 修剪草坪/P2034 选择数字 )题解

P2627 [USACO11OPEN] Mowing the Lawn G ( [USACO Open11] 修剪草坪/P2034 选择数字 )题解

时间:2024-01-23 15:34:48浏览次数:31  
标签:Lawn ch Mowing 题解 P2034 USACO11OPEN P2627

P2627 [USACO11OPEN] Mowing the Lawn G

搬运工
单调队列优化DP
简单题,和P2034重了
题意:给定一行 \(n\) 个非负整数 \(a_1 \cdots a_n\)。现在你可以选择其中若干个数,但不能有超过 \(k\) 个连续的数字被选择。你的任务是使得选出的数字的和最大。(直接抄的2034)
正着考虑发现很麻烦,不知道咋维护,但是我们如果考虑删去的话就很有前途,正难则反。
设 \(f_i\) 表示前 \(i\) 个数合法状态的最小删除和,方程 \(f_i=max\{a_t+f_{t-1}\}\)
到 \(i\) 位置时,肯定选出一个位置 \(t\) 的数字删去,\(i-k\le t\le i\),选完之后,我们还要保证选的 \(t\) 位置之前是合法状态,所以再加上 \(f_{t-1}\),拿单调队列优化就做完了。

#include<bits/stdc++.h>
#define int long long
inline int read(){
	char ch=getchar();int x=0,f=1;
	for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
	for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<3)+(x<<1)+(ch^48);
	return x*f;
}
const int N=1e5+10;
int n,k,q[N],e[N],head=1,tail=0,f[N];
signed main(){
	// freopen("in.in","r",stdin);freopen("out.out","w",stdout);
	n=read();k=read();int ans=0;
	for(int i=1;i<=n;++i)e[i]=read(),ans+=e[i];
	for(int i=1;i<=k;++i){
		while(head<=tail&&e[i]<=e[q[tail]])tail--;
		q[++tail]=i;
	}
	for(int i=k+1;i<=n;++i){
		int l=i-k;
		while(head<=tail&&e[i]+f[i-1]<=e[q[tail]]+f[q[tail]-1])tail--;
		q[++tail]=i;
		if(q[head]<l)head++;
		f[i]=e[q[head]]+f[q[head]-1];
	}
	std::cout<<ans-f[n];
}

标签:Lawn,ch,Mowing,题解,P2034,USACO11OPEN,P2627
From: https://www.cnblogs.com/Ishar-zdl/p/17982582

相关文章

  • LOJ3990/LG9602 IOI2023 足球场 题解 (区间DP+精简无用状态)
    首先考虑一个足球场长啥样才是合法的。发现一个点能只拐弯一次到达另一个点,可以分为两种情况:先左右走,再上下走或先上下走,后左右走。无论哪种情况,都要求我们走一步使得和目标点一个轴相同,再走一步使得另一个轴也相同,所以加入把每一行选择的格子看成一个区间(因为如果不连续显然是......
  • CF327C Magic Five 题解
    CF327CMagicFive搬运工单调队列优化DP加等比数列求和首先\(5\)的倍数要求末尾是\(0\)或\(5\)所以我们只用看给定字符串的\(0\)和\(5\)就好,我们钦定他是最终的数的末尾。在他之前的选择删掉,在他之后的全部删掉,方案数就是\(2^{pow-1}\),答案累加就可以了。容易想到......
  • P2254 [NOI2005] 瑰丽华尔兹 题解
    P2254[NOI2005]瑰丽华尔兹搬运工单调队列优化DP还是先朴素,设\(f_{t\i\j\d}\)表示在第\(t\)个时刻,在\(i,j\)位置上,上一步是停留还是滑动的最大步数。这个就是四个方向随便转移。\(T_{max}=4*10^4\)这么做肯定不行。发现\(k\)很小,只有\(200\),所以不妨让\(k\)......
  • P2569 [SCOI2010] 股票交易 题解
    P2569[SCOI2010]股票交易搬运工稍微复杂一点的单调队列优化DP直接设\(f_{i\j}\)表示在第\(i\)天,手上还剩\(j\)个股票时的最大收入。容易写出状态转移方程:\(f_{i\j}=max\{f_{k\t}+(t-j)\cdotw\}\),这样不好看,我们可以拆成这样的形式:\[f_{i\j}=max\{f_{k\t}+t\cdo......
  • P4899 [IOI2018] werewolf 狼人 题解
    因为我记忆力不好,经常遇到之前做过的题一下子想不起来,所以打算基本上给每个比较有意思的题写题解,同时造福后代。这是werewolf,它是furry,很可爱题意:一张无向图,点有点权,每次询问从\(u\)到\(v\)的路径中,是否存在一条先走点权大于等于\(L\),再走点权小于等于\(R\)的路径。思路......
  • hugeの张江蔡唐氏模拟赛题解
    晚三huge不让去一机房,说便于管理,我的评价是:唐氏况且二机房没有luogu,改完题后没事干(指写不了狼人),遂写个没人看的题解。T1纯哈希,不写。T2纯tarjan,一直没学,不写。T3比较套路的双指针,赛时降智题意:给定由\(B\)和\(R\)组成的字符串,环形结构,每次可以交换相邻,问最少多少次可以......
  • 01.22 ARC170 题解慢报
    补完了,来发题解慢报。AB就不写了。CPrefixMexSequence考虑DP,\(f(i,j)\)表示前\(i\)个数,填了\(j\)个不同的数。如果\(s_{i+1}=1\)那么这位唯一确定,只需要保证\(j<m\)即可转移到\(f(i+1,j+1)\);如果\(s_{i+1}=0\)那么可以选旧的数也可以选新的数,分别转移即可。D......
  • 「Daily OI Round 1」block 题解
    设\(c_u\)表示节点\(u\)的颜色,\(f_u\)表示只考虑原树中\(u\)的子树中的点、选择点\(u\)的方案数。对于儿子\(v\),可以选择同色儿子节点,也可以跳过这个儿子节点,选择\(v\)的与\(u\)同色的儿子节点\(w\),故状态转移方程为:\[f_u=\prod[c_u=c_v]f_v+\left(\prod[c_u=c_w]......
  • CF1424M Ancient Language 题解
    1.题意描述一本字典中有\(r\)\((1\leqr\leq10^6)\)个单词,单词长度不超过$10^3$,所有字母都是小写英文字母,但字母排序不是按英文字母排序,求所有出现字母的一种排序,如果不存在,输出"IMPOSSIBLE"。2.题目分析由排序规则可知,对于字符串\(s\)和\(t\),\(s\)排在\(t\)......
  • CF618C Constellation 题解
    题意描述给定\(n\)个点(\(n\leq10^5\)),找到三个点满足这三个点不在同一直线上且三个点构成的三角形中不包含其他点,保证所有点不会在同一直线上。题目分析首先必然每一个点都可以作为一组解中的点。不妨其中一个点编号为\(1\)。找一个点作为第二个点,为了使没有点在这条边上,这......