4

HNU: 小学期软件实训第二周(继续划水)

 4 years ago
source link: https://noionion.top/54171.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
贰猹の小窝

HNU: 小学期软件实训第二周(继续划水)

发表于 2021-07-15|更新于 2021-07-15|C++ 学习笔记
字数总计:13.8k|阅读时长:55 分钟 | 阅读量:39

居然出了一道动态规划题…… 模拟题也越来越恶心(变得越加又臭又长)


本周作业让我感觉比较有收获的题(从高到低):

21. 新型冠状病毒(COVID19)传播


1. 字符串反转 2

题目 题解

跟上周那道题很像吗,不过不是对每个单词反转,而是把整句反转,单词不反转

用栈解决即可

代码

2.487-3279

题目 题解

看起来其实就是每个字符串做标准化处理后统计,一顿 map 了事

代码

3. 缺席考试的是谁?

题目 题解

这题实际上就是找只出现过一遍的名字,其它名字都是出现过两次的。

这里给两个方法:(我用的是第一种)

第一种是 map 存储,某个名字被录第一遍时存储,录第二遍的时候就删除(不是次数 + 1,不然后面找出来会超时),然后迭代器查 map(map 此时只存了答案)

第二种是对所有名字排序,然后查 i 和 i+1 是不是相同的(i 为偶数,从 0-(2n-4)),一直查到不是相同的。如果没查到就是 i=2n-2 的名字。

PS:用 cin 记得读入优化!

代码

4. 电话号码

题目 题解

这题属实复杂,直接看我代码注释边理解吧。

代码

5. 点球大战

题目 题解

这题其实在于每行的空格数不定,所以取出倒数第二个判断是不是 no 比较麻烦

没关系,问题不大,我们整行读入,然后切割完丢进栈里,然后取第二个嘿嘿嘿

剩下的统计就是小事啦!

代码

6. 飞行棋

题目 题解

纯模拟,每步换人走,可以写个递推

然后每步走完判断有没有到达终点、超出边界、跳格、打到另一个人

代码 题目 题解

刚开始没注意到第一格要黑色,栽了。然后没想到直接暴力搜就行。。。

这里建议从大棋盘到小棋盘开始搜,搜到就能直接 break 了(搜索怎么搜?看注释!!!)

代码

8.Engine - 字符串

题目 题解

这题也老麻烦了。。。

第一个是查询时大小写不影响,也就是说读入时就要做标准化处理

第二个是得刚刚好长度的单词,比如 find 匹配不了 finding,所以就不能直接字符串 find 啦

直接看代码注释吧。。。

代码

9. 字符串压缩

题目 题解

本来以为是贪心的,然后一想 aaaa,emmm 贪心不科学啊,按经验就是动态规划啦

知道是 dp 题后就简单了。老师放水说了一个一个加,那就很明显了

对于每个长度 l,都有初始 dp[l]=dp[l-1]+a

构建状态转移方程 dp[l] = min(dp[l], dp[mid]+b)(以 mid 为切割点切割长度为 l 的子串,右半是左半的子串时转移。(l+1)/2<=mid<l)

代码

10. 拼写检查

题目 题解

这题也是又臭又长,看起来很麻烦但写起来也还好(我刚开始跳了这题

这题直接看代码注释吧

代码

11. 最小的 K 个数

题目 题解

这个提示我没看到,但其实无所谓,set 和 map 都自带排序,去重也无所谓,用 map 的话直接桶排序原理就是

代码

12. 绩点计算

题目 题解

水题一道,直接模拟过。。。

代码

13.xxx 定律

题目 题解

其实这题应该叫 “冰雹猜想”,也是纯模拟,一个 while 解决(能不写递归就不写递归)

代码

14. 数的距离差

题目 题解

显然这个数离最大值最小值的平均值越近越好,

所以我们考虑排序完直接 lower_bound,然后查左右(当然直接暴力一个一个查也行)

代码

15. 亲和数

题目 题解

把两个数的约数和分别算出来比较就行。。。水题一道

当然要优化也是有的,只是打起来麻烦,就不写了

代码

16. 金币

题目 题解

计算 i^2 和(i 和小于总天数),然后加上剩余天数 *(i+1) 就行

代码

17. 小 A 的计算器

题目 题解

这题的数据量。。。字符串长度不大于 10,26 进制转化成 10 进制也不会爆 int。可以直接转换成 10 进制作加法,然后再转化回来就行

那如果要应对大数据?用高精度加法吧 (小学加法原理就是了)

具体可以看关于 C++ 高精度运算的几种方式

代码

18. 小丑排序

题目 题解

其实就是 0,3,5… 再倒回来到 1,分奇偶判断下就行

代码

19. 数圈

题目 题解

我们找一找 1 的位置,找规律绕圈出来就行

代码

20. 锤子剪刀布

题目 题解

又是一道统计的水题。。。

代码

21. 新型冠状病毒(COVID19)传播

题目 题解

这题和第九题相对比较有思考量一点

找出所有感染者的思路较难,所以我们反向寻找,找到安全的人的数目。

而安全的人有什么特点呢?

我们将安全的人分为两个部分:一部分人初始位置小于零号感染者;另一部分人初始位置大于零号感染者。

初始位置小于零号感染者的人要想不被感染,其速度只能小于等于右边所有人的最小速度。因为我们将零号感染者看做在右边。右边速度最小的那个人一定会被零号感染者感染。而左边人的速度要是大于这个最小速度,那么也会被感染。

所以初始位置大于零号感染者的人要想不被感染,其速度只能大于等于左边所有人的最大速度。

然后就是各种代码了。你可以像我一样,直接以上面的思路直接模拟

也可以以速度作为第一关键字,位置作为第二关键字排序,然后找第一个位置大于零号等于位置的编号和最后一个位置小于等于零号位置的编号,这两个编号之间的人(包括编号对应人的本身)就是感染者(为什么?自行理解)

代码

第二周复盘结束。有什么问题可以评论留言


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK