Codeforces 940E - Cashback
940E - Cashback
思路:
dp+rmq
可以证明最后划分的区间可以由长度为1和长度为c的区间组成的,这样就可以用O(n)的dp求了,区间最小值随便拿什么维护都可以
状态:dp[i]表示到i这个位置为止的最小划分和
初始状态:dp[0]=0
目标状态:dp[n]
状态转移:dp[i]=min(dp[i-1]+a[i],dp[i-c]+sum[i]-sum[i-c]+minmum(i-c+1,i))
代码:
#include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define mp make_pair #define ls rt<<1,l,m #define rs rt<<1|1,m+1,r #define pli pair<ll,int> #define mem(a,b) memset(a,b,sizeof(a))const int N=1e5+5; const int INF=0x7f7f7f7f; int a[N],tree[N<<2],cnt; ll sum[N],dp[N]; void push_up(int rt){tree[rt]=min(tree[rt<<1],tree[rt<<1|1]); } void build(int rt,int l,int r){if(l==r){cin>>a[++cnt];tree[rt]=a[cnt];return ;}int m=(l+r)>>1;build(ls);build(rs);push_up(rt); } int query(int L,int R,int rt,int l,int r){if(L<=l&&r<=R){return tree[rt];}int ans=INF,m=(l+r)>>1;if(L<=m)ans=min(ans,query(L,R,ls));if(R>m)ans=min(ans,query(L,R,rs));return ans; } int main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int n,c;cin>>n>>c;build(1,1,n);for(int i=1;i<=n;i++)sum[i]=sum[i-1]+a[i];for(int i=1;i<=n;i++){if(i-c>=0)dp[i]=min(dp[i-1]+a[i],dp[i-c]+sum[i]-sum[i-c]-query(i-c+1,i,1,1,n));else dp[i]=dp[i-1]+a[i];}cout<<dp[n]<<endl;return 0; }
转载于:https://www.cnblogs.com/widsom/p/8494892.html
Codeforces 940E - Cashback相关推荐
- [Codeforces 940E]Cashback(dp+set)
题目链接:http://codeforces.com/problemset/problem/940/E 思路:划分任意长度,每c长度区间可去除一个最小值,所以划分方法就是单独自己一个或者长度为c的区间 ...
- Codeforces 940E Cashback
Cashback 题意:一共给你N个数, 然后将他们分成连续的子集, 每个集合可以删除 元素个数/c 个最小元素, 然后求每个集合删除元素后的总和. 题解:我们将集合分为1个元素或者K个元素,每K个 ...
- codeforces 940E Cashback 有趣的dp
题解 这么明显的一个dp,我怎么就没看出来呢?! 首先我们需要一些前提条件:任何划分出来的一个区间的长度不应该超过c. 如果这个区间长度大于c,那么设len=n∗c+klen=n∗c+klen=n*c ...
- [Codeforces 940E]Cashback
Description 题库链接 给你两个整数 \(n,c\) ,以及一个数列 \(A\) ,让你将序列分为许多段.对于每一段,他的价值为序列内除了最小的 \(\left\lfloor\frac{le ...
- CodeForces - 940E Cashback (DP+思维模型)
题意:给你长度为n的数列,一段序列的价值是,所有数的总和-最小的len/c的数的和,求如何分割数列,使得答案总和最小. 分析:一开始看到向下取整不外乎两种情况:一是用计算机处理,那么表明用暴力,emm ...
- codeforces 940E. Cashback(线性dp)
传送门 题意:给出一个nnn个数的序列,要求将序列分成若干段,对于一段长度为kkk的自动删去最小的⌊kc⌋\left \lfloor \frac{k}{c} \right \rfloor⌊ck⌋个数 ...
- Codeforces 940E: Cashback 单调队列优化DP
传送门 题目描述 给你一个长度为n的数列a和整数c 你需要把它任意分段 每一段假设长度为k,就去掉前 ⌊kc⌋\lfloor\frac{k}{c}\rfloor⌊ck⌋小的数 最小化剩下的数的和 分 ...
- Cashback [CodeForces - 940E]
http://codeforces.com/problemset/problem/940/E 题意 将数组a划分成若干段,使每段的f值之和最小,其中f值是区间内元素和减去前k/c(下取整)小的数. 分 ...
- CF 940E Cashback (DP+multiset)
题目链接:http://codeforces.com/problemset/problem/940/E 题意:给一个长度为n的序列a,将它任意分成几个连续子序列,对于一个长度为K的子序列,可以删掉它前 ...
最新文章
- 文档管理服务器文件的脱机编辑选项无法编辑,让MOSS2007文档的存取更具个性
- 微信小程序图片变形解决方法
- shell注释与赋值
- MySQL数据库从入门到实战(四)
- python高斯分布训练_Python画图高斯分布的示例
- Xamarin组件包 Xamarin.ToolKit
- rest资源设计_REST资源何时应获得其自己的地址?
- [前端漫谈] 做一个四则计算器
- jsp mysql电子档案管理系统_学生档案管理系统的设计与实现(JSP,MySQL)(含录像)
- R_ggplot2作图原理
- 值得投入精力的APP运营:用户、活动和数据!
- 信捷XD/XC系列PLC 控制台达B2系列伺服电机程序,手动 自动,循环,循环次数设定
- Python基础 | 快速实现label_to_index
- 爱普生LQ-635K针式打印机打链式打印纸设置自动切纸方法
- shell编程中文件安全性的保证
- 包头事业单位计算机考试试题,内蒙古包头市事业单位考试题库及答案(事业编笔试题库)...
- Atmega32最简单的按键程序
- c语言中1 3.0,1.4.1 先看Turbo C/C++ 3.0(3)
- win11专业版+VMware16.1.2+不可恢复错误: (vcpu-1) Exception 0xc0000005 (access violation)
- 杭州java好找工作吗_【java】我是学java的应届毕业生,来杭州一个多星期了,还没找到工作,能指点...