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相关推荐

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

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

  2. Codeforces 940E Cashback

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

  3. codeforces 940E Cashback 有趣的dp

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

  4. [Codeforces 940E]Cashback

    Description 题库链接 给你两个整数 \(n,c\) ,以及一个数列 \(A\) ,让你将序列分为许多段.对于每一段,他的价值为序列内除了最小的 \(\left\lfloor\frac{le ...

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

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

  6. codeforces 940E. Cashback(线性dp)

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

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

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

  8. Cashback [CodeForces - 940E]

    http://codeforces.com/problemset/problem/940/E 题意 将数组a划分成若干段,使每段的f值之和最小,其中f值是区间内元素和减去前k/c(下取整)小的数. 分 ...

  9. CF 940E Cashback (DP+multiset)

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

最新文章

  1. 文档管理服务器文件的脱机编辑选项无法编辑,让MOSS2007文档的存取更具个性
  2. 微信小程序图片变形解决方法
  3. shell注释与赋值
  4. MySQL数据库从入门到实战(四)
  5. python高斯分布训练_Python画图高斯分布的示例
  6. Xamarin组件包 Xamarin.ToolKit
  7. rest资源设计_REST资源何时应获得其自己的地址?
  8. [前端漫谈] 做一个四则计算器
  9. jsp mysql电子档案管理系统_学生档案管理系统的设计与实现(JSP,MySQL)(含录像)
  10. R_ggplot2作图原理
  11. 值得投入精力的APP运营:用户、活动和数据!
  12. 信捷XD/XC系列PLC 控制台达B2系列伺服电机程序,手动 自动,循环,循环次数设定
  13. Python基础 | 快速实现label_to_index
  14. 爱普生LQ-635K针式打印机打链式打印纸设置自动切纸方法
  15. shell编程中文件安全性的保证
  16. 包头事业单位计算机考试试题,内蒙古包头市事业单位考试题库及答案(事业编笔试题库)...
  17. Atmega32最简单的按键程序
  18. c语言中1 3.0,1.4.1 先看Turbo C/C++ 3.0(3)
  19. win11专业版+VMware16.1.2+不可恢复错误: (vcpu-1) Exception 0xc0000005 (access violation)
  20. 杭州java好找工作吗_【java】我是学java的应届毕业生,来杭州一个多星期了,还没找到工作,能指点...

热门文章

  1. 收入--支出=储蓄?
  2. 3d空间中球体的动量守恒
  3. 新版汇编语言程序设计【课后习题答案】
  4. Eclipse开发工具的使用
  5. 【JS】常用js方法
  6. 合肥市专利申请费用减缓流程是怎样的
  7. 我这两年提升技术的经历和感受(舒适区危机篇)
  8. ES进阶之路二(ES7-ES12)
  9. 网站适配IE浏览器的几个注意事项
  10. 【Linux】Shell 特殊符号总结 数组