每日一练c++题目日刊 | 第七期
文章目录
- 第一题:最小的 k 个数
- 题目描述
- 输入格式
- 输出格式
- 输入样例
- 输出样例
- 解题思路&C++题解
- 算法
- 第二题:智慧之海
- 故事背景
- 题目描述
- 输入格式
- 输出格式
- 输入样例
- 输出样例
- 解题思路&C++题解
第一题:最小的 k 个数
题目描述
有一个长度为 n 的由 0 和 1 组成的字符串 s,你需要用最少的步数将其变成只包含 0 的字符串。在每一步中,你可以选择任意一个子串,并将其中所有 1 都反转为 0。你需要输出最少的步数。
例如,对于字符串 s = “110101”,你可以进行如下步骤:
第一步:反转从第 1 个字符到第 3 个字符的子串 “110”,得到字符串 “000101”。
第二步:反转从第 1 个字符到第 6 个字符的子串 “000101”,得到字符串 “000000”。
因此,最少的步数为 2。
输入格式
输入的第一行包含一个字符串 s,长度不超过 10510^5105。
输出格式
输出一个整数,表示最少的步数。
输入样例
110101
输出样例
2
解题思路&C++题解
请在下面编写你的 C++ 代码来解决这道题目:
#include <iostream>
#include <string>using namespace std;int main() {// 读入字符串 sstring s;cin >> s;// 计算最少的步数int steps = 0;// 在此处编写你的代码// 输出结果cout << steps << endl;return 0;
}
算法
这道题目的算法设计是使用前缀和数组来计算最少的步数。
首先,我们从前往后遍历字符串 s,并计算出前缀和数组 prefix。前缀和数组的定义是,对于字符串 s,前缀和数组为 a,则 a[i] 表示 s[1] 到 s[i] 中 1 的数量。
然后,对于每一个字符,我们进行如下操作:
如果当前字符是 1,则将步数加 1。
否则,枚举以当前字符为起点的子串,并计算出它中 1 的数量。然后用这个数量来更新答案。
这样的时间复杂度是O(n2)O(n^2)O(n2),因为我们对于每一个字符都枚举了它的子串。
但是,我们可以使用前缀和数组来优化这个算法。使用前缀和数组,我们可以在O(1)O(1)O(1)的时间内计算出任意一个子串中 1 的数量。因此,我们可以将时间复杂度优化到O(n)O(n)O(n)。
下面是 c++ 代码实现:
#include <iostream>
#include <string>using namespace std;int main() {// 读入字符串 sstring s;cin >> s;int n = s.size();// 计算前缀和数组int prefix[n + 1];prefix[0] = 0;for (int i = 1; i <= n; i++) {prefix[i] = prefix[i - 1] + (s[i - 1] == '1');}// 计算最少的步数int steps = 0;for (int i = 0; i < n; i++) {// 如果当前字符是 1,则将步数加 1if (s[i] == '1') {steps++;}// 否则,枚举以当前字符为起点的子串else {for (int j = i + 1; j <= n; j++) {// 计算子串中 1 的数量int ones = prefix[j] - prefix[i];// 更新答案steps = min(steps, ones);}}}// 输出结果cout << steps << endl;return 0;
}
上面的代码实现了状态转移方程的过程。
注意:
矩阵的行和列都是从 1 开始编号的,所以要注意初始化和转移的时候数组下标的边界。
在转移的时候,需要考虑使用道具的情况。
第二题:智慧之海
故事背景
海神波塞冬拥有着神奇的能力,他能够将一个人的智慧转化成数字,并将这个数字存储在一个无序数组中。但是,有一天,海神波塞冬收到了一个神秘的任务,要求他从这个无序数组中找出最小的 k 个数,并将它们存储在另一个数组中。
题目描述
给定一个无序数组 a 和整数 k,你需要在 a 中找出最小的 k 个数,并将它们存储在另一个数组 b 中。
例如,对于数组 [3, 4, 1, 2, 5] 和 k = 3,你可以进行如下操作:
第一步:找出数组中最小的数字 1,将其存储在另一个数组 b 中。
第二步:找出数组中第二小的数字 2,将其存储在另一个数组 b 中。
第三步:找出数组中第三小的数字 3,将其存储在另一个数组 b 中。
因此,最后得到的另一个数组 b 为 [1, 2, 3]。
请在下面编写你的 C++ 代码来解决这道题目:
#include <iostream>
#include <algorithm>using namespace std;int main() {// 读入数组 a 和 kint a[10], k;for (int i = 0; i < 10; i++) {cin >> a[i];}cin >> k;// 计算最小的 k 个数并存储在另一个数组 b 中int b[k];// 在此处编写你的代码// 输出结果for (int i = 0; i < k; i++) {cout << b[i] << " ";}cout << endl;return 0;
}
请注意,你的算法的时间复杂度应该尽可能低。
输入格式
第一行包含整数 n,表示数组 a 的长度。
第二行包含 n 个整数,依次为数组 a 的元素。
第三行包含整数 k。
输出格式
输出一行,包含 k 个整数,依次为数组 b 中的元素。
输入样例
5
3 4 1 2 5
3
输出样例
1 2 3
解题思路&C++题解
这道题的题意是,给定一个无序数组 a 和整数 k,你需要在 a 中找出最小的 k 个数,并将它们存储在另一个数组 b 中。
解题思路:
一种方法是使用排序算法将数组 a 排序,然后直接取前 k 个数即可。时间复杂度为 O(nlogn)O(nlogn)O(nlogn)。
另一种方法是使用堆来解决这道题。我们可以将数组 a 中的数字插入到一个大根堆中,然后每次取出堆顶元素,将其存储在数组 b 中。这样,当我们取出了 k 个数字之后,堆中剩余的数字就是最小的 k 个数字。因此,我们可以在每次插入元素之前检查堆的大小,如果堆的大小超过 k,就将堆顶元素弹出。
这种方法的时间复杂度为 O(nlogk)O(nlogk)O(nlogk),要比前一种方法更优。
下面是使用堆来解决这道题的 C++ 代码:
#include <iostream>
#include <algorithm>
#include <queue>using namespace std;int main() {// 读入数组 a 和 kint n, k;cin >> n;int a[n];for (int i = 0; i < n; i++) {cin >> a[i];}cin >> k;// 计算最小的 k 个数并存储在另一个数组 b 中int b[k];priority_queue<int, vector<int>, greater<int> > q;for (int i = 0; i < n; i++) {q.push(a[i]);if (q.size() > k) {q.pop();}}for (int i = k - 1; i >= 0; i--) {b[i] = q.top();q.pop();}// 输出结果for (int i = 0; i < k; i++) {cout << b[i] << " ";}cout << endl;return 0;
}
这就是使用堆来解决本题的解法。
每日一练c++题目日刊 | 第七期相关推荐
- 每日一小练——按字典顺序列出全部子集
上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:按字典顺序列出全部子集 内容: 请写一个程序用字典顺序把一个{1,2,3,4,...,n}集合的全部子集找出来. 解答: ...
- 每日一小练——高速Fibonacci数算法
上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:高速Fibonacci数算法 内容:先说说Fibonacci数列,它的定义是数列:f1,f2....fn有例如以下规律: ...
- 每日一小练——求质数
上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:求质数 内容: 试编写一个程序,找出前N个质数.如果没有进一步要求,这不是难题.但在此希望从所知的.使用除法的方法中,用最 ...
- 每日一小练——支配值数目
上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:支配值数目 内容:已知f[]和g[]两个整数数组,元素都已经从小到大排列,试编写程序算出f[]中每一个元素比g[]中每一个 ...
- CSDN 每日一练及周赛介绍
CSDN 每日一练及周赛介绍 每日一练 每日一练入口 CSDN 周赛 CSDN 周赛入口 相关社区 每日一练社区入口 CSDN 竞赛专区社区入口 每日一练题库 每日一练速查 每日一练题目题解速查入口 ...
- python题目关于企业利润_【每日一练】巧用python实现利润计算
原标题:[每日一练]巧用python实现利润计算 相信很多小伙伴都遇到过阶梯利率的问题,比如说银行的利息计算,不同阶段的本金有不同的利率:税务的税费计算,不同的营收有不同的缴纳率:个人的提成,不同的销 ...
- java 矩阵题目_java练习本(原每日一练)(20190517)
名人名言 昨日翻译 "You will face many defeats in life, but never let yourself be defeated." --Maya ...
- 用python做简单的题目_「每日一练」巧用python做小学的数学题
原标题:「每日一练」巧用python做小学的数学题 很多的小学问题其实已经比较复杂了,我们运用传统的算法,可能会比较难以理解,这里我们可以巧用Python来完成一些小学题目的计算! 下边我们就一起来看 ...
- python列表框_「每日一练」Python列表框部件的运用
原标题:「每日一练」Python列表框部件的运用 用Python就一定要用到界面操作,有一个好的用户界面,才会有好的用户体验,下边就开始创建我们的主窗口,并设置相应的列表框部件吧! 案例 创建主窗口, ...
最新文章
- YY的GCD 莫比乌斯反演
- OPENFIRE支持EMOJI
- python爬虫教程入门-零基础入门Python爬虫不知道怎么学?这是入门的完整教程
- Eclipse——Java可视化开发环境配置
- Best Cow Line
- 联想340c笔记本cpu能升级吗_高性价比十大笔记本电脑(由高到低价格),有一台五五开也有.........
- iOS 使用NSUserdefault 保存自定义的 对象
- 大数据产业目前面临哪些问题
- 容器技术Docker K8s 3 容器技术基础-Docker
- 计算机基础中通信概预算,通信工程概预算编制系统的设计与实现
- 《机器学习-原理、算法与应用》出版了
- ALFA深度学习外观检测自学习人工智能软件
- PID调节参数的作用
- 【JAVA语言学习】Java面向对象Ⅲ
- 时间观——《天行九歌》第51集《一叶知秋》台词与典故
- Synopsys ICC 笔记
- Kubernetes 存活探针和就绪探针的最佳实践
- Android 手机模拟游戏手柄(USB,C#,winio)
- 软件测试——单元测试/集成测试/系统测试/验收测试
- 吉时利Keithley软件2600系列2601B|2602B|2604B|2606B NS-SourceMeter源表软件