这道题好像很烦,我第一眼看过去确实没有任何思路。

但是仔细分析题目后,我们会发现:

  • c=1c=1c=1 时,答案为 0,但是好像没有这个点?
  • c>nc > nc>n 时,答案为序列总和。
  • c=nc = nc=n 时,答案为序列总和减去最小值。
  • 1<c<n1 < c < n1<c<n 且 n<2×cn < 2 \times cn<2×c 时,此时序列只能分为一段,而别的序列我们可以看成是长度为 1 的区间。
  • 1<c<n1 < c < n1<c<n 且 2×c≤n2 \times c \leq n2×c≤n 时,我们可以将序列分为多段,而此时别的序列仍然可以分割成长度为 1 的区间。

因此只有两种区间:长度为 1 和长度为 ccc。

接下来主要考虑 1<c<n1 < c < n1<c<n 的情况。

我们发现,此时问题就变成了一个 dp 问题。

设 fif_ifi​ 表示到 aia_iai​ 截止时的答案,那么:

  • 1≤i<c1 \leq i < c1≤i<c 时:fi=∑j=1iajf_i = \sum_{j = 1}^{i}a_jfi​=j=1∑i​aj​
  • c≤i≤nc \leq i \leq nc≤i≤n 时:fi=min⁡(fi−c+sumi−sumi−c−minni,fi−1+ai)f_i = \min{(f_{i - c} + sum_i - sum_{i - c} - minn_i,f_{i - 1} +a_i)}fi​=min(fi−c​+sumi​−sumi−c​−minni​,fi−1​+ai​)

其中 sumsumsum 是前缀和数组,minniminn_iminni​ 表示 [i−c+1,i][i - c + 1,i][i−c+1,i] 这一段区间中的 aia_iai​ 的最小值。

然后发现 ccc 是确定的,于是对 minniminn_iminni​ 直接单调队列优化即可,总复杂度 O(n)O(n)O(n)。

Code:

/*
======== Plozia =========Author:PloziaProblem:CF940E CashbackDate:2021/1/6
========= Plozia =========
*/#include <bits/stdc++.h>
using namespace std;typedef long long LL;
const int MAXN = 1e5 + 10;
int n, c, q[MAXN], l = 1, r = 0;
LL a[MAXN], f[MAXN], minn[MAXN], sum[MAXN];LL read()
{LL sum = 0, fh = 1; char ch = getchar();while (ch < '0' || ch > '9') {if (ch == '-') fh = -1; ch = getchar();}while (ch >= '0' && ch <= '9') {sum = (sum << 3) + (sum << 1) + (ch ^ 48); ch = getchar();}return sum * fh;
}int main()
{n = read(), c = read();for (int i = 1; i <= n; ++i) a[i] = read();for (int i = 1; i <= n; ++i){while (l <= r && q[l] + c <= i) l++;while (l <= r && a[i] <= a[q[r]]) r--;q[++r] = i; minn[i] = a[q[l]]; sum[i] = sum[i - 1] + a[i];}for (int i = 1; i < c; ++i) f[i] = f[i - 1] + a[i];for (int i = c; i <= n; ++i) f[i] = min(f[i - c] + sum[i] - sum[i - c] - minn[i], f[i - 1] + a[i]);printf("%lld\n", f[n]);return 0;
}

CF940E Cashback 题解相关推荐

  1. 【DP】CF940E Cashback

    题意: 定义一种取值方式为:在一个长度为k的串中,去掉其最小的⌊kc⌋⌊kc⌋\lfloor \frac k c \rfloor个数,剩下的数之和即为这个串的值.现在给出c,以及一个长度为N的初始串, ...

  2. 【CF940E】Cashback(单调队列dp)

    传送门 Solution: 既然是删掉k/c个,那么k<c是不删除的无意义,k=c删除1个,c<=k<2c还是删除1个,那么相当于第c+1个到第k个放在上一区间是无意义的.证明:假如 ...

  3. 【codeforces】【比赛题解】#940 CF Round #466 (Div. 2)

    人生的大起大落莫过如此,下一场我一定要回紫. [A]Points on the line 题意: 一个直线上有\(n\)个点,要求去掉最少的点,使得最远两点距离不超过\(d\). 题解: 暴力两重fo ...

  4. Codeforces 940E Cashback

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

  5. [JS][dfs]题解 | #迷宫问题#

    题解 | #迷宫问题# 题目链接 迷宫问题 题目描述 定义一个二维数组 N*M ,如 5 × 5 数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 1, 1 ...

  6. [JS][dp]题解 | #打家劫舍(一)#

    题解 | #打家劫舍(一)# 题目链接 打家劫舍(一) 题目描述 描述 你是一个经验丰富的小偷,准备偷沿街的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家, ...

  7. [JS]题解 | #魔法数字#

    题解 | #魔法数字# 题目链接 魔法数字 题目描述 牛妹给牛牛写了一个数字n,然后又给自己写了一个数字m,她希望牛牛能执行最少的操作将他的数字转化成自己的. 操作共有三种,如下: 在当前数字的基础上 ...

  8. [JS]题解 | #岛屿数量#

    题解 | #岛屿数量# 题目链接 岛屿数量 题目描述 时间限制:1秒 空间限制:256M 描述 给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛.我们只考虑上下左右 ...

  9. [JS] 题解:提取不重复的整数

    题解:提取不重复的整数 https://www.nowcoder.com/practice/253986e66d114d378ae8de2e6c4577c1 时间限制:1秒 空间限制:32M 描述 输 ...

最新文章

  1. Nginx服务器搭建和基本配置详解
  2. 学习String的内容
  3. 【BLE】信号强度(RSSI)知识整理
  4. 今晚直播 | 小米人工智能部崔世起:小爱同学全双工技术实践
  5. 从零开始数据科学与机器学习算法-分类与决策树-06
  6. 又拍网架构-又一个用到python的网站
  7. 日站会——你的站会姿势正确吗?
  8. ansys18安装以后打不开_【偷偷告诉你】在微信里直接安装apk.1
  9. #6282. 数列分块入门 6
  10. 如何增加Android模拟器的可用空间
  11. 简单使用NSURLConnection、NSURLRequest和NSURL
  12. ssd trim linux,linux – 使用SSD上的BtrFS验证TRIM支持
  13. 多表查询过滤重复数据_数据分析工具SQL—多表查询
  14. php文件开头加数据,在PHP中附加到文件的开头
  15. 用Go语言打印三角形汇总 (Golang经典编程案例)
  16. windows桌面美化
  17. 2020年如何运营抖音、快手、视频号3个短视频平台
  18. 算法提高 字符串跳步
  19. 艾美捷SequENZ测序级改造型胰蛋白酶用途和技术说明
  20. Python爬虫(第五周)

热门文章

  1. 【ROS】实操_话题发布
  2. Excel 表格中固定表头
  3. 战区与游戏服务器的连线已中断,使命召唤战区无法连接服务器如何解决?无法连接服务器解决方法介绍[多图]...
  4. Coredata的版本升级
  5. DIY时钟类--广州百田笔试之一
  6. 【latex】表格添加注脚;对表格的内容进行注释
  7. 北风:如何自学营销策划和网络营销?
  8. MATLAB--数值计算(矩阵)
  9. C#连接Excel文件的连接字符串
  10. CGB2106-Day01