文章目录

  • 第一题:最小的 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. 每日一小练——按字典顺序列出全部子集

    上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:按字典顺序列出全部子集 内容: 请写一个程序用字典顺序把一个{1,2,3,4,...,n}集合的全部子集找出来. 解答: ...

  2. 每日一小练——高速Fibonacci数算法

    上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:高速Fibonacci数算法 内容:先说说Fibonacci数列,它的定义是数列:f1,f2....fn有例如以下规律: ...

  3. 每日一小练——求质数

    上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:求质数 内容: 试编写一个程序,找出前N个质数.如果没有进一步要求,这不是难题.但在此希望从所知的.使用除法的方法中,用最 ...

  4. 每日一小练——支配值数目

    上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:支配值数目 内容:已知f[]和g[]两个整数数组,元素都已经从小到大排列,试编写程序算出f[]中每一个元素比g[]中每一个 ...

  5. CSDN 每日一练及周赛介绍

    CSDN 每日一练及周赛介绍 每日一练 每日一练入口 CSDN 周赛 CSDN 周赛入口 相关社区 每日一练社区入口 CSDN 竞赛专区社区入口 每日一练题库 每日一练速查 每日一练题目题解速查入口 ...

  6. python题目关于企业利润_【每日一练】巧用python实现利润计算

    原标题:[每日一练]巧用python实现利润计算 相信很多小伙伴都遇到过阶梯利率的问题,比如说银行的利息计算,不同阶段的本金有不同的利率:税务的税费计算,不同的营收有不同的缴纳率:个人的提成,不同的销 ...

  7. java 矩阵题目_java练习本(原每日一练)(20190517)

    名人名言 昨日翻译 "You will face many defeats in life, but never let yourself be defeated." --Maya ...

  8. 用python做简单的题目_「每日一练」巧用python做小学的数学题

    原标题:「每日一练」巧用python做小学的数学题 很多的小学问题其实已经比较复杂了,我们运用传统的算法,可能会比较难以理解,这里我们可以巧用Python来完成一些小学题目的计算! 下边我们就一起来看 ...

  9. python列表框_「每日一练」Python列表框部件的运用

    原标题:「每日一练」Python列表框部件的运用 用Python就一定要用到界面操作,有一个好的用户界面,才会有好的用户体验,下边就开始创建我们的主窗口,并设置相应的列表框部件吧! 案例 创建主窗口, ...

最新文章

  1. YY的GCD 莫比乌斯反演
  2. OPENFIRE支持EMOJI
  3. python爬虫教程入门-零基础入门Python爬虫不知道怎么学?这是入门的完整教程
  4. Eclipse——Java可视化开发环境配置
  5. Best Cow Line
  6. 联想340c笔记本cpu能升级吗_高性价比十大笔记本电脑(由高到低价格),有一台五五开也有.........
  7. iOS 使用NSUserdefault 保存自定义的 对象
  8. 大数据产业目前面临哪些问题
  9. 容器技术Docker K8s 3 容器技术基础-Docker
  10. 计算机基础中通信概预算,通信工程概预算编制系统的设计与实现
  11. 《机器学习-原理、算法与应用》出版了
  12. ALFA深度学习外观检测自学习人工智能软件
  13. PID调节参数的作用
  14. 【JAVA语言学习】Java面向对象Ⅲ
  15. 时间观——《天行九歌》第51集《一叶知秋》台词与典故
  16. Synopsys ICC 笔记
  17. Kubernetes 存活探针和就绪探针的最佳实践
  18. Android 手机模拟游戏手柄(USB,C#,winio)
  19. 软件测试——单元测试/集成测试/系统测试/验收测试
  20. 吉时利Keithley软件2600系列2601B|2602B|2604B|2606B NS-SourceMeter源表软件

热门文章

  1. 图神经网络学习记录:《图神经网络综述:模型与应用》
  2. 设计模式之策略模式(Strategy Pattern)
  3. Agile - 埃杰团队每日例会博客目录
  4. 金蝶EAS客户端List界面列表数据不合并的方法
  5. DockerHub入门
  6. 当夫子邂逅舞池——读《花鼓歌》
  7. Java数字化智慧校园平台源码,智慧学校源码+微信小程序+人脸电子班牌
  8. 个人作业——A002-185-2515-郑远曦
  9. 1+X Web前端证书中级备考攻略
  10. Zabbix探索:关于网络设备SysUpTime监控的问题