传送门
题意:给出一个nnn个数的序列,要求将序列分成若干段,对于一段长度为kkk的自动删去最小的⌊kc⌋\left \lfloor \frac{k}{c} \right \rfloor⌊ck​⌋个数,求删去之后剩下的数的和的最小值。


思路:显然每个被分开的段长不超过ccc时最优(不然会有其他更小的局部最小值来替代不够优),于是dpdpdp转移一下就行了:

  1. 当前这个位置跟之前的分在一起:fi=fi−1+aif_i=f_{i-1}+a_ifi​=fi−1​+ai​
  2. 把当前靠右的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)相关推荐

  1. [Codeforces 940E]Cashback(dp+set)

    题目链接:http://codeforces.com/problemset/problem/940/E 思路:划分任意长度,每c长度区间可去除一个最小值,所以划分方法就是单独自己一个或者长度为c的区间 ...

  2. CodeForces - 940E Cashback (DP+思维模型)

    题意:给你长度为n的数列,一段序列的价值是,所有数的总和-最小的len/c的数的和,求如何分割数列,使得答案总和最小. 分析:一开始看到向下取整不外乎两种情况:一是用计算机处理,那么表明用暴力,emm ...

  3. Codeforces 940E - Cashback

    940E - Cashback 思路: dp+rmq 可以证明最后划分的区间可以由长度为1和长度为c的区间组成的,这样就可以用O(n)的dp求了,区间最小值随便拿什么维护都可以 状态:dp[i]表示到 ...

  4. CodeForces - 456C Boredom(线性dp)

    题目链接:点击查看 题目大意:给出一个由n个数字组成的数列,现在给出规则是,每次选择数列中的一种数字 x,选择后的贡献为 x,不过操作后会删除掉所有数值为 x + 1 和 x - 1 的数,现在问如何 ...

  5. codeforces 940E Cashback 有趣的dp

    题解 这么明显的一个dp,我怎么就没看出来呢?! 首先我们需要一些前提条件:任何划分出来的一个区间的长度不应该超过c. 如果这个区间长度大于c,那么设len=n∗c+klen=n∗c+klen=n*c ...

  6. Codeforces 940E: Cashback 单调队列优化DP

    传送门 题目描述 给你一个长度为n的数列a和整数c 你需要把它任意分段 每一段假设长度为k,就去掉前 ⌊kc⌋\lfloor\frac{k}{c}\rfloor⌊ck​⌋小的数 最小化剩下的数的和 分 ...

  7. Codeforces 940E Cashback

    Cashback 题意:一共给你N个数, 然后将他们分成连续的子集, 每个集合可以删除 元素个数/c  个最小元素, 然后求每个集合删除元素后的总和. 题解:我们将集合分为1个元素或者K个元素,每K个 ...

  8. CF 940E Cashback (DP+multiset)

    题目链接:http://codeforces.com/problemset/problem/940/E 题意:给一个长度为n的序列a,将它任意分成几个连续子序列,对于一个长度为K的子序列,可以删掉它前 ...

  9. CodeForces 1096D(线性dp)

    传送门 •题意 给出一个长度为n的字符串s,对于每个$s_{i}$有$a_{i}$的价值 让你删除最小的价值,使得字符串中不存在$hard$这个子序列 •思路 设dp[1]是不存在以$h$为前缀的最小 ...

最新文章

  1. cmake使用示例与整理总结_QTVLC的博客-CSDN博客_cmake使用示例与整理 施公队演示时用的blog B zhan
  2. [转载]:TRY...CATCH (Transact-SQL)
  3. linux安装nginx源码,CentOS7源码编译安装Nginx
  4. Angular搭建框架比较好用的插件
  5. 63. Unique Paths II and 64. Minimum Path Sum
  6. java程序员面试需要注意什么_Java程序员面试时要注意的一些问题
  7. ApplicationContext 和 BeanFactory 的区别
  8. 青岛计算机学校分数线,青岛计算机应用与维修专业职业学校收费标准,物联网应用技术中专学校分数线...
  9. Linux bond6配置文件,Linux网卡bond
  10. 《电子元器件的可靠性》——第1章概述
  11. el captain设置环境变量
  12. 动物统计加强版 nyoj290
  13. linux端口利用入侵,利用samba服务漏洞入侵linux主机
  14. 没有基础怎么自学渗透测试工程师?
  15. html 中thead标签,HTML thead 标签
  16. “菜刷刷”系统装机流程
  17. 批量启用AD中账户的Exchange邮箱
  18. 华为:将在员工绩效考核中增加“伙伴满意度”选项;谷歌研究员“走火入魔”,被罚带薪休假;魅族回应被吉利收购 | EA周报...
  19. 1010: 求圆的周长和面积 ZZULIOJ
  20. windows下安装VIM

热门文章

  1. html文件用服务器打开很慢,网页打开太慢?快试试这6招!
  2. 向假视频宣战!研究人员开发出了鉴定假视频的“照妖镜”
  3. js的阻塞加载、延迟加载和异步加载
  4. dagger2-基础篇
  5. itext 简介、中文文档、中英对照文档 下载
  6. 信息碎片化时代, 如何让学习更有效
  7. Linux环境中对海康威视工业相机SDK进行二次开发(QT+CMake+Opencv+海康SDK)
  8. 【文献摘录】癫痫与脑电图特点
  9. CORR函数 看不明白
  10. FTP 获取远程目录列表返回421错误