CF940E Cashback 题解
这道题好像很烦,我第一眼看过去确实没有任何思路。
但是仔细分析题目后,我们会发现:
- 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∑iaj
- 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 题解相关推荐
- 【DP】CF940E Cashback
题意: 定义一种取值方式为:在一个长度为k的串中,去掉其最小的⌊kc⌋⌊kc⌋\lfloor \frac k c \rfloor个数,剩下的数之和即为这个串的值.现在给出c,以及一个长度为N的初始串, ...
- 【CF940E】Cashback(单调队列dp)
传送门 Solution: 既然是删掉k/c个,那么k<c是不删除的无意义,k=c删除1个,c<=k<2c还是删除1个,那么相当于第c+1个到第k个放在上一区间是无意义的.证明:假如 ...
- 【codeforces】【比赛题解】#940 CF Round #466 (Div. 2)
人生的大起大落莫过如此,下一场我一定要回紫. [A]Points on the line 题意: 一个直线上有\(n\)个点,要求去掉最少的点,使得最远两点距离不超过\(d\). 题解: 暴力两重fo ...
- Codeforces 940E Cashback
Cashback 题意:一共给你N个数, 然后将他们分成连续的子集, 每个集合可以删除 元素个数/c 个最小元素, 然后求每个集合删除元素后的总和. 题解:我们将集合分为1个元素或者K个元素,每K个 ...
- [JS][dfs]题解 | #迷宫问题#
题解 | #迷宫问题# 题目链接 迷宫问题 题目描述 定义一个二维数组 N*M ,如 5 × 5 数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 1, 1 ...
- [JS][dp]题解 | #打家劫舍(一)#
题解 | #打家劫舍(一)# 题目链接 打家劫舍(一) 题目描述 描述 你是一个经验丰富的小偷,准备偷沿街的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家, ...
- [JS]题解 | #魔法数字#
题解 | #魔法数字# 题目链接 魔法数字 题目描述 牛妹给牛牛写了一个数字n,然后又给自己写了一个数字m,她希望牛牛能执行最少的操作将他的数字转化成自己的. 操作共有三种,如下: 在当前数字的基础上 ...
- [JS]题解 | #岛屿数量#
题解 | #岛屿数量# 题目链接 岛屿数量 题目描述 时间限制:1秒 空间限制:256M 描述 给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛.我们只考虑上下左右 ...
- [JS] 题解:提取不重复的整数
题解:提取不重复的整数 https://www.nowcoder.com/practice/253986e66d114d378ae8de2e6c4577c1 时间限制:1秒 空间限制:32M 描述 输 ...
最新文章
- Nginx服务器搭建和基本配置详解
- 学习String的内容
- 【BLE】信号强度(RSSI)知识整理
- 今晚直播 | 小米人工智能部崔世起:小爱同学全双工技术实践
- 从零开始数据科学与机器学习算法-分类与决策树-06
- 又拍网架构-又一个用到python的网站
- 日站会——你的站会姿势正确吗?
- ansys18安装以后打不开_【偷偷告诉你】在微信里直接安装apk.1
- #6282. 数列分块入门 6
- 如何增加Android模拟器的可用空间
- 简单使用NSURLConnection、NSURLRequest和NSURL
- ssd trim linux,linux – 使用SSD上的BtrFS验证TRIM支持
- 多表查询过滤重复数据_数据分析工具SQL—多表查询
- php文件开头加数据,在PHP中附加到文件的开头
- 用Go语言打印三角形汇总 (Golang经典编程案例)
- windows桌面美化
- 2020年如何运营抖音、快手、视频号3个短视频平台
- 算法提高 字符串跳步
- 艾美捷SequENZ测序级改造型胰蛋白酶用途和技术说明
- Python爬虫(第五周)