codeforces 940E. Cashback(线性dp)
传送门
题意:给出一个nnn个数的序列,要求将序列分成若干段,对于一段长度为kkk的自动删去最小的⌊kc⌋\left \lfloor \frac{k}{c} \right \rfloor⌊ck⌋个数,求删去之后剩下的数的和的最小值。
思路:显然每个被分开的段长不超过ccc时最优(不然会有其他更小的局部最小值来替代不够优),于是dpdpdp转移一下就行了:
- 当前这个位置跟之前的分在一起:fi=fi−1+aif_i=f_{i-1}+a_ifi=fi−1+ai
- 把当前靠右的ccc个位置分在一起:fi=fi−c+sumi−c+1,i−mini−c+1,if_i=f_{i-c}+sum_{i-c+1,i}-min_{i-c+1,i}fi=fi−c+sumi−c+1,i−mini−c+1,i
第二类的minminmin可以用STLSTLSTL来做~~%%%单调队列的神仙~~
代码:
#include<bits/stdc++.h>
#define ri register int
using namespace std;
inline int read(){int ans=0;char ch=getchar();while(!isdigit(ch))ch=getchar();while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();return ans;
}
typedef long long ll;
const int N=1e5+5;
int n,c,a[N];
ll sum=0,f[N];
multiset<int>::iterator it;
multiset<int>S;
int main(){freopen("lx.in","r",stdin);n=read(),c=read();for(ri i=1;i<=n;++i)a[i]=read();if(c==1)return cout<<0,0;sum=a[1],f[1]=a[1],S.insert(a[1]);for(ri i=2;i<=n;++i){sum+=a[i],S.insert(a[i]),f[i]=f[i-1]+a[i];if(i==c)f[i]-=*S.begin();if(i>c)it=S.find(a[i-c]),sum-=a[i-c],S.erase(it),f[i]=min(f[i],f[i-c]+sum-(*S.begin()));}return cout<<f[n],0;
}
codeforces 940E. Cashback(线性dp)相关推荐
- [Codeforces 940E]Cashback(dp+set)
题目链接:http://codeforces.com/problemset/problem/940/E 思路:划分任意长度,每c长度区间可去除一个最小值,所以划分方法就是单独自己一个或者长度为c的区间 ...
- CodeForces - 940E Cashback (DP+思维模型)
题意:给你长度为n的数列,一段序列的价值是,所有数的总和-最小的len/c的数的和,求如何分割数列,使得答案总和最小. 分析:一开始看到向下取整不外乎两种情况:一是用计算机处理,那么表明用暴力,emm ...
- Codeforces 940E - Cashback
940E - Cashback 思路: dp+rmq 可以证明最后划分的区间可以由长度为1和长度为c的区间组成的,这样就可以用O(n)的dp求了,区间最小值随便拿什么维护都可以 状态:dp[i]表示到 ...
- CodeForces - 456C Boredom(线性dp)
题目链接:点击查看 题目大意:给出一个由n个数字组成的数列,现在给出规则是,每次选择数列中的一种数字 x,选择后的贡献为 x,不过操作后会删除掉所有数值为 x + 1 和 x - 1 的数,现在问如何 ...
- codeforces 940E Cashback 有趣的dp
题解 这么明显的一个dp,我怎么就没看出来呢?! 首先我们需要一些前提条件:任何划分出来的一个区间的长度不应该超过c. 如果这个区间长度大于c,那么设len=n∗c+klen=n∗c+klen=n*c ...
- Codeforces 940E: Cashback 单调队列优化DP
传送门 题目描述 给你一个长度为n的数列a和整数c 你需要把它任意分段 每一段假设长度为k,就去掉前 ⌊kc⌋\lfloor\frac{k}{c}\rfloor⌊ck⌋小的数 最小化剩下的数的和 分 ...
- Codeforces 940E Cashback
Cashback 题意:一共给你N个数, 然后将他们分成连续的子集, 每个集合可以删除 元素个数/c 个最小元素, 然后求每个集合删除元素后的总和. 题解:我们将集合分为1个元素或者K个元素,每K个 ...
- CF 940E Cashback (DP+multiset)
题目链接:http://codeforces.com/problemset/problem/940/E 题意:给一个长度为n的序列a,将它任意分成几个连续子序列,对于一个长度为K的子序列,可以删掉它前 ...
- CodeForces 1096D(线性dp)
传送门 •题意 给出一个长度为n的字符串s,对于每个$s_{i}$有$a_{i}$的价值 让你删除最小的价值,使得字符串中不存在$hard$这个子序列 •思路 设dp[1]是不存在以$h$为前缀的最小 ...
最新文章
- cmake使用示例与整理总结_QTVLC的博客-CSDN博客_cmake使用示例与整理 施公队演示时用的blog B zhan
- [转载]:TRY...CATCH (Transact-SQL)
- linux安装nginx源码,CentOS7源码编译安装Nginx
- Angular搭建框架比较好用的插件
- 63. Unique Paths II and 64. Minimum Path Sum
- java程序员面试需要注意什么_Java程序员面试时要注意的一些问题
- ApplicationContext 和 BeanFactory 的区别
- 青岛计算机学校分数线,青岛计算机应用与维修专业职业学校收费标准,物联网应用技术中专学校分数线...
- Linux bond6配置文件,Linux网卡bond
- 《电子元器件的可靠性》——第1章概述
- el captain设置环境变量
- 动物统计加强版 nyoj290
- linux端口利用入侵,利用samba服务漏洞入侵linux主机
- 没有基础怎么自学渗透测试工程师?
- html 中thead标签,HTML thead 标签
- “菜刷刷”系统装机流程
- 批量启用AD中账户的Exchange邮箱
- 华为:将在员工绩效考核中增加“伙伴满意度”选项;谷歌研究员“走火入魔”,被罚带薪休假;魅族回应被吉利收购 | EA周报...
- 1010: 求圆的周长和面积 ZZULIOJ
- windows下安装VIM