Description

题库链接

给你两个整数 \(n,c\) ,以及一个数列 \(A\) ,让你将序列分为许多段。对于每一段,他的价值为序列内除了最小的 \(\left\lfloor\frac{lenth}{c}\right\rfloor\) 个元素以外的其他所有元素和, \(lenth\) 为该段的长度。最小化这个价值和。

\(1\leq n,c\leq 100000,1\leq A_i\leq 10^9\)

Solution

一个由贪心得出的结论是整个序列只要分为若干个长度为 \(c\) 的段和若干个长度为 \(1\) 的段即可。

既然要最小化价值,相当于删去的数要尽可能大。

首先分一段长度为 \(c+x,x<c\) 的段,不如分为一段为 \(c\) , \(x\) 段长度为 \(1\) 。因为无论哪种分法都只能删去一个数,但第二种考虑的范围更广一些。

其次分一段长度为 \(2c\) 的段,不如分 \(2\) 段长度为 \(c\) 的段。假设 \(2c\) 段内的最小值和次小值的位置均在前半段内;若我用第二种方法分就一定能够更优。

由此,我们令 \(f_i\) 为转移到 \(i\) 这个位置时之前的最小价值和,转移的时候只要考虑长度分为 \(1\) 和 \(c\) 的情况。对于要删去最小值,用 \(st\) 表来实现查找最值就可以了。

复杂度为 \(O(n~log_2n)\) ,瓶颈在预处理 \(st\) 表,转移是 \(O(n)\) 的。

Code

//It is made by Awson on 2018.2.25
#include <bits/stdc++.h>
#define LL long long
#define dob complex<double>
#define Abs(a) ((a) < 0 ? (-(a)) : (a))
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define Swap(a, b) ((a) ^= (b), (b) ^= (a), (a) ^= (b))
#define writeln(x) (write(x), putchar('\n'))
#define lowbit(x) ((x)&(-(x)))
using namespace std;
const int N = 1e5;
void read(int &x) {char ch; bool flag = 0;for (ch = getchar(); !isdigit(ch) && ((flag |= (ch == '-')) || 1); ch = getchar());for (x = 0; isdigit(ch); x = (x<<1)+(x<<3)+ch-48, ch = getchar());x *= 1-2*flag;
}
void print(LL x) {if (x > 9) print(x/10); putchar(x%10+48); }
void write(LL x) {if (x < 0) putchar('-'); print(Abs(x)); }int n, c, a[N+5], st[N+5][20], lim, limc, bin[25];
LL f[N+5], sum[N+5];int query(int l, int r) {return Min(st[l][limc], st[r-bin[limc]+1][limc]); }
void work() {read(n), read(c); lim = log(n)/log(2), limc = log(c)/log(2);bin[0] = 1; for (int i = 1; i <= 20; i++) bin[i] = bin[i-1]<<1;for (int i = 1; i <= n; i++) read(a[i]), st[i][0] = a[i];for (int i = 1; i <= n; i++) sum[i] = sum[i-1]+a[i];for (int t = 1; t <= lim; t++) for (int i = 1; i+bin[t]-1 <= n; i++) st[i][t] = Min(st[i][t-1], st[i+bin[t-1]][t-1]);for (int i = 1; i <= n; i++) {f[i] = f[i-1]+a[i];if (i >= c) f[i] = Min(f[i-c]+sum[i]-sum[i-c]-query(i-c+1, i), f[i]);}writeln(f[n]);
}
int main() {work(); return 0;
}

转载于:https://www.cnblogs.com/NaVi-Awson/p/8468561.html

[Codeforces 940E]Cashback相关推荐

  1. Codeforces 940E - Cashback

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

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

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

  3. Codeforces 940E Cashback

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

  4. codeforces 940E Cashback 有趣的dp

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

  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. 2018年东北农业大学春季校赛 D wyh的迷宫【搜索】
  2. java51游戏_Java作业实践(一)魔板游戏
  3. CC++图形图像处理开源库
  4. JavaScript之Set与Map
  5. PX4/Pixhawk---uORB深入理解和应用
  6. 套接字编程--1(UDP协议编程,端口号,传输层协议,网络字节序)
  7. php get 分页,PHP_codeigniter实现get分页的方法,本文实例讲述了codeigniter实现ge - phpStudy...
  8. 回字有四样写法之引号编码
  9. MusicPlayer音乐播放器Android
  10. qcc300x笔记之固件升级(六)
  11. 永磁同步电机的矢量控制策略(十二)一一一MTPA最大转矩电流比控制
  12. 男生种草潮流社区edge(嘿市),会是男生的小红书吗?
  13. iOS开发:Mach-O入门理解
  14. android 中文冒号,Kotlin中双冒号::使用方法
  15. vPro里面的v代表什么意思?
  16. 用于即使在太空中也能随时随地进行编码的移动应用程序
  17. 【Redis】RedisCluster 批量删除key
  18. java中if(a.c())_if 语句中的条件语句只能是() 类型。_学小易找答案
  19. 【C语言】自由落体第n次落地共经过多少米,第n次弹起的高度
  20. 还行,OPPO Find X3 Pro评测:卖的是屏幕和这个超广角!

热门文章

  1. ES6+(前端面试题整合)
  2. THUWC2019 游记
  3. selenium操作无界面chrome浏览器
  4. 数组的length属性和String的length()方法
  5. HTML CSS添加阴影
  6. 模拟两个神经元的连接,突触前神经元分别传递兴奋性和抑制性信号给突触后神经元(神经元模型使用HH方程)
  7. 二重积分的计算.02
  8. 刚体运动的表示及其Mathematica实现
  9. vscode 如何修改字体大小
  10. 云之道知识付费3.1.1【最新开源】全插件,独立版