第十三届蓝桥杯省赛 Java A 组 I 题、Python A 组 I 题、Python B 组 J 题——最优清零方案(AC)
1.最优清零方案
1.题意描述
给定一个长度为 NNN 的数列 A1,A2,⋯,ANA_1,A_2,⋯,A_NA1,A2,⋯,AN 。现在小蓝想通过若干次操作将 这个数列中每个数字清零。
每次操作小蓝可以选择以下两种之一:
- 选择一个大于 0 的整数, 将它减去 1 ;
- 选择连续 KKK 个大于 0 的整数, 将它们各减去 1 。
小蓝最少经过几次操作可以将整个数列清零?
2.输入格式
输入第一行包含两个整数 NNN 和 KKK 。
第二行包含 NNN 个整数A1,A2,⋯,ANA_1,A_2,⋯,A_NA1,A2,⋯,AN。
3.输出格式
输出一个整数表示答案。
4.样例输入
4 2
1 2 3 4
5.样例输出
6
6.数据范围
1≤K≤N≤1000000,0≤Ai≤1000000。1≤K≤N≤1000000,0≤A_i ≤1000000 。1≤K≤N≤1000000,0≤Ai≤1000000。
7.原题链接
最优清零方案
2.解题思路
比较直观地思考,如果没有操作2
,那么总操作次数则是数组的总和。对于答案来说操作2
一定是不差于操作1
的,为了使操作次数更少,我们应该尽可能多使用操作2
。
所以问题转化为我们对数组最多能进行几次操作2
?答案即是操作2
的次数加上剩下数组的总和。
对于一段区间 [l,r][l,r][l,r],它能进行操作的次数应当是该区间内的最小值 mimimi,然后我们需要将区间 [l,r][l,r][l,r] 所有数都减去 mimimi。由于需要去考虑每一个长度为 KKK 的连续子数组,显然我们需要使用到滑动窗口去解决问题。
从贪心的角度思考,我们从左往右进行窗口滑动,统计操作2
可进行的最大次数。
对于每一个长度为 KKK 的区间 [l,r][l,r][l,r] 如果我们都手动去遍历得到 mimimi 以及手动减去mimimi,在极限数据下且k=n/2k=n/2k=n/2时,复杂度会是O(n2)O(n^2)O(n2)所以会超时。
考虑如何优化,假设此时枚举的窗口的起点为 lll,那么终点为l+k−1l+k-1l+k−1,设区间 [l,r][l,r][l,r] 的最小值的下标为 t(t∈[l,r])t(t\in[l,r])t(t∈[l,r]),如果按照正常滑动窗口,我们下一次窗口枚举的起点为 l+1l+1l+1,但由于操作2
要求区间全部数一定大于0
。显然 a[t]a[t]a[t] 在减去mimimi之后的值一定为0
,意味着区间内包含下标t
一定不可能再进行操作2
,我们可以将下一次窗口枚举的起点设为t+1
,以此完成优化,减少无效窗口的枚举次数。
值得注意一点的是一个区间[l,r][l,r][l,r]可能同时有多个最小值下标 ttt,我们应当选择最右边的一个。
3.Ac_code
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long uLL;
typedef pair<int, int> PII;
#define pb(s) push_back(s);
#define SZ(s) ((int)s.size());
#define ms(s,x) memset(s, x, sizeof(s))
#define all(s) s.begin(),s.end()
const int inf = 0x3f3f3f3f;
const int mod = 1000000007;
const int N = 200010;int n, k;
void solve()
{std::cin >> n >> k;std::vector<int> a(n);LL ans = 0;for (auto&v : a) {cin >> v;}for (int i = 0; i + k - 1 < n; ++i) {int t = 0;int mi = 1e9;for (int j = i; j < i + k; ++j) {if (a[j] <= mi) {t = j;mi = a[j];}}ans += mi;for (int j = i; j < i + k; ++j) a[j] -= mi;i = t;}for (auto v : a) ans += v;cout << ans << '\n';
}
int main()
{ios_base :: sync_with_stdio(false);cin.tie(0); cout.tie(0);int t = 1;while (t--){solve();}return 0;
}
第十三届蓝桥杯省赛 Java A 组 I 题、Python A 组 I 题、Python B 组 J 题——最优清零方案(AC)相关推荐
- 第十三届蓝桥杯省赛 JAVA A组 - 蜂巢
✍个人博客:https://blog.csdn.net/Newin2020?spm=1011.2415.3001.5343
- 2022 第十三届 蓝桥杯 省赛 Java B组 真题 详细解析 答案
文章目录 试题 A: 星期计算 [问题描述] [答案] 试题 B: 山 [问题描述] [答案] 试题 C: 字符统计 [问题描述] [答案] 试题 D: 最少刷题数 [问题描述] [答案] 试题 E: ...
- 第十三届蓝桥杯模拟赛第二期JAVA组个人题解
第十三届蓝桥杯模拟赛第二期JAVA组个人题解 文章目录 第十三届蓝桥杯模拟赛第二期JAVA组个人题解 题目1 题目2 题目3 题目4 题目5 题目6 题目7 题目8 题目9 题目10 题目1 小蓝的I ...
- java迷宫类编程题_第十届蓝桥杯省赛java类B组 试题 E:迷宫 (动态规划之回溯法)...
问题描述 试题 E: 迷宫 [问题描述] 下图给出了一个迷宫的平面图,其中标记为 1 的为障碍,标记为 0 的为可 以通行的地方. 010000 000100 001001 110000 迷宫的入口为 ...
- 2022年第十三届蓝桥杯省赛C/C++B组个人题解
2022年第十三届蓝桥杯省赛C/C++B组个人题解 试题 A: 九进制转十进制(数学) 试题 B: 顺子日期(语文) 试题 C: 刷题统计(模拟) [样例输入] [样例输出] 试题 D: 修剪灌木(找 ...
- 2022年十三届蓝桥杯国赛(C/C++大学B组)个人题解
2022年十三届蓝桥杯国赛(C/C++大学B组)个人题解 更新:成绩出来了,估分50分左右,最后拿了个国二,还差点到国一,有点出乎意料,挺满意了挺满意了. 去年国赛基本都是暴力,最后国三都没拿到(我是 ...
- 第十三届蓝桥杯省赛C++B组题解
写在前面 · 本篇题解对应的是第十三届蓝桥杯省赛C++组的B组的第一场 · 所使用的语言时Python3(其实主要看思路.是什么语言不重要
- 第十三届蓝桥杯模拟赛(第三期)试题与题解 C++
文章目录 第十三届蓝桥杯模拟赛(第三期)试题与题解 1.试题A 题解:数制转换 2.试题B 题解:枚举 3.试题C 题解:枚举 4.试题D 题解:最小生成树 5.试题E 方法一:暴力求和 方法二:一维 ...
- 第十三届蓝桥杯国赛真题 PythonB组 复盘以及获奖感言(国一!!!)
第十三届蓝桥杯国赛真题 PythonB组 复盘以及获奖感言(国一) 文章目录 第十三届蓝桥杯国赛真题 PythonB组 复盘以及获奖感言(国一)
最新文章
- Linux下二进制文件安装MySQL
- RSA加密解密简单使用
- Team Task:DP
- 服务器被黑给我上了一课
- Keil4编译原子哥的SYSTEM出现错误 Inline assembler not permitted when generating Thumb code
- java输出链表的值_[剑指offer] 从尾到头打印链表(三种方法) java
- redis入门——服务器篇
- mybatis 缓存 一级缓存
- jedis 用连接池时超时返回值类型错误
- 圆与平面的接触面积_如果把绝对圆的球体放在绝对平的平面上,那接触面是不是无限小?...
- 光流(三)--LK算法改进(金字塔LK)
- HDOJ-1875-畅通工程再续 解题报告
- 测试开发面试题汇总20200422
- Hbuilder连接苹果手机
- 在计算机网络中ftp服务器的用途是,FTP的作用以及传输文件的一般步骤
- 对象存储(Object-based Storage)概述
- dlopen与dlsym用法
- 零基础学习《计算机操作系统》
- html让视频跟图片之间无缝,图片、样式、音视频之间的无缝拼接,教你一个万能方法!...
- caffe模型训练与使用(windows平台)
热门文章
- Swift Invalid bitcode version (Producer: '802.0.41.0_0' Reader: '800.0.42.1_0')
- Navicat Premium模型存储路径
- win98系统只能进安全模式的解决方法
- htonl、htons头文件
- Revit翻模 | 千呼万唤始上架的『图转喷淋』到底妙在哪里?
- 更改jupyter的字体为consolas
- 版权保护和商标注册有什么关系
- 关于阿里矢量图iconfont的应用
- 快速清空Excel表格(超级表)
- 方舟编译器学习笔记分类与导读