【CF933E】A Preponderant Reunion(动态规划)
【CF933E】A Preponderant Reunion(动态规划)
题面
题解
直接做很不好搞,我们把条件放宽,我们每次可以选择两个相邻的非零数让他们减少任意值,甚至可以减成负数(虽然你肯定不会把它弄成负数的)。代价为减少的值。不难证明这个问题的答案不会优于原题目。
我们假定只处理\([l,r]\)这段区间的数\(p_l,p_{l+1},...,p_r\)的答案,为了方便,我们假定数列开头结尾都是\(0\)。
我们令\(c_l=p_l,c_i=\max\{p_i-c_{i-1},0\}\),那么我们必定可以构造一种方案,使得处理这一段区间使得所有数都变成非负数的代价为\(\sum c_i\)。然后设\(f[l][r]\)为这个值。
f[l][r]&=f[l][r-2]+c_{r-1}+c_r\\
&=f[l][r-2]+c_{r-1}+\max\{p_r-c_{r-1},0\}\\
&=f[l][r-2]+\max\{p_r,c_{r-1}\}\\
&\ge f[l][r-2]+p_r\\
&=f[l][r-2]+f[r][r]
\end{aligned}\]
所以一个区间\([l,r]\)可以拆分成\([l,r-2]\)这个区间的打啊,然后是\(r-1\)保留为正数,\([r,r]\)这个区间的答案。然后递归处理前面这一段区间,我们得到的就是每次可以拆分出\(2\)个或者\(1\)个位置使得他们变成\(0\),有\(2\)的原因是当区间长度为\(2\)的时候不得不使得两个位置都是\(0\)而不能拆分。
于是我们就考虑每次放\(0\)段的长度,这个长度可以是\(1\)或者\(2\),然后大力转移一下就可以。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
#define ll long long
#define MAX 300300
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int n,p[MAX],g[MAX];ll f[MAX];
vector<int> Ans;
void Work(int i){int x=min(p[i],p[i+1]);if(!x)return;Ans.push_back(i);p[i]-=x;p[i+1]-=x;}
int main()
{
n=read();
for(int i=1;i<=n;++i)p[i]=read();
memset(f,63,sizeof(f));f[0]=0;
for(int i=1;i<=n;++i)
{
f[i]=min(f[max(i-2,0)]+p[i],f[max(i-3,0)]+max(p[i],p[i-1]));
if(f[i]==f[max(i-3,0)]+max(p[i],p[i-1]))g[i]=1;
}
ll ans=min(f[n],f[n-1]);
for(int i=n-(ans==f[n-1]);i>0;i=i-2-g[i])
{
Work(i-1);if(g[i])Work(i-2);Work(i);
}
printf("%d\n",(int)Ans.size());
for(int v:Ans)printf("%d\n",v);
return 0;
}
【CF933E】A Preponderant Reunion(动态规划)的更多相关文章
- CF933E A Preponderant Reunion DP
传送门 题解搬运工 设原问题为问题A.每一次减少\(\min\{p_i , p_{i+1}\}\)难以处理,我们考虑将限制变得宽松一些:每一次可以减少\([1,\min\{p_i , p_{i+1}\ ...
- 增强学习(三)----- MDP的动态规划解法
上一篇我们已经说到了,增强学习的目的就是求解马尔可夫决策过程(MDP)的最优策略,使其在任意初始状态下,都能获得最大的Vπ值.(本文不考虑非马尔可夫环境和不完全可观测马尔可夫决策过程(POMDP)中的 ...
- 简单动态规划-LeetCode198
题目:House Robber You are a professional robber planning to rob houses along a street. Each house has ...
- 动态规划 Dynamic Programming
March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: ...
- 动态规划之最长公共子序列(LCS)
转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...
- C#动态规划查找两个字符串最大子串
//动态规划查找两个字符串最大子串 public static string lcs(string word1, string word2) { ...
- C#递归、动态规划计算斐波那契数列
//递归 public static long recurFib(int num) { if (num < 2) ...
- 动态规划求最长公共子序列(Longest Common Subsequence, LCS)
1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...
- 【BZOJ1700】[Usaco2007 Jan]Problem Solving 解题 动态规划
[BZOJ1700][Usaco2007 Jan]Problem Solving 解题 Description 过去的日子里,农夫John的牛没有任何题目. 可是现在他们有题目,有很多的题目. 精确地 ...
随机推荐
- R语言实战 第7章
# 01 描述性统计分析 --------------------------------------------------------------#针对总体的mycavs = mtcars[,c( ...
- R-6 线性回归模型流程
本节内容: 0:小知识 1:新数据要如何进行分析 2:第二步骤:理解数据 3:第三步骤:相关分析 4:特殊点 0:小知识 0.1:我们说对分析一个数据一般是分步骤的:那么我们可以对其中的步骤进行打标签 ...
- [考试反思]1111csp-s模拟测试110:三思
题目名是为了照应3天的倒计时(我才不会说是因为我考场又摸鱼了) 在OJ上得到了295的好成绩,但是本地评测没有O2掉了10分. 总体来说还可以.T1全场切,T2半场切,T3纯暴力不卡常都有95... ...
- Maven項目打包報錯:Plugin execution not covered by lifecycle configuration
Maven項目打包報錯:Plugin execution not covered by lifecycle configuration 使用Eclipse导入一个新的maven项目时不时的会遇到这个错 ...
- 【docker构建】基于docker构建wordpress博客网站平台
WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站.也可以把 WordPress当作一个内容管理系统(CMS)来使用. WordPre ...
- Zabbix-(七)分布式监控
Zabbix-(七)分布式监控 一.前言 Zabbix提供了一套分布式监控的方案,即使用Zabbix Proxy,本文记录使用Zabbix Proxy进行分布式监控. 官方所述Proxy的使用场景如下 ...
- win7怎么使用远程桌面连接(win10类似,同样适用)
win7使用远程桌面比mac要简单多了,只需在桌面点击“开始”,找到并打开“附件”,点击“远程桌面连接”即可 mac使用远程桌面连接:https://www.cnblogs.com/tu-071 ...
- [Spring cloud 一步步实现广告系统] 11. 使用Feign实现微服务调用
上一节我们使用了Ribbon(基于Http/Tcp)进行微服务的调用,Ribbon的调用比较简单,通过Ribbon组件对请求的服务进行拦截,通过Eureka Server 获取到服务实例的IP:Por ...
- Git错误:error:failed to push some refs to 'git@gitee.com:name/project.git'
大家在通过本地仓库上传文件到远程仓库时,会报出 error:failed to push some refs to 'git@gitee.com:name/project.git' 的错误. 解决方法 ...
- [转]Introduction - Run Excel Macro using VBScript
本文转自:https://wellsr.com/vba/2015/excel/run-macro-without-opening-excel-using-vbscript/ Have you ever ...