HDU 100:两个月挑战

情况
大一学了C++的基础知识和极其少的stl内容,没学数据结构与算法
刷HDU的2000-2099 检测一下C++的情况
每天**1.5h(3~4题)**的刷题,以及不限制限制时间的反思
半个小时,不会就跳,结束后复盘
我的代码仓库:https://github.com/Ttzs-Git/learning-logs/
具体位置: /learning-CPP-language/cpp-algo
可能常用网站
解题反思
HDU 2000
我的代码中主要使用sort和vector,因此思路很简单。
- 题解1:使用冒泡排序(问题: 感觉写的比较死,无法支持数量改变的数据),不过正好练习一下冒泡排序的代码
- 两个题解都是用数组写的
- 题解2:EOF对HDU 2003挺重要的
HDU 2001
我的代码主要使用vector和sqrt写的,
本题的关键点:题目中提示四个实数
题解1: 使用的cin>>a>>b>>c>>d—-这让我思考一个问题;是否全部的输入结束以后才能开始输出?
题解2:使用scanf的返回值是输入值的个数,也可以用在HDU 2003
小数点后的位数使用printf的格式化控制比较简单
HDU 2002
本题的关键: 整数整除和float,double的测试
注意:
- 4/3=1;—给忘记了
HDU 2003
- 题解一: 提醒使用abs函数
HDU 2004
- 题解二: 字符数组挺不错的,可以代替冗长的switch
HDU 2005
- 题解一二: 冗长的switch可以使用数组代替
HDU 2006
- 题解一:使用num&1判断奇数
HDU 2007
由于没有评测机,所以只能使用样例。发现自己忽略了x和y的大小关系
- 题解一:使用swap
HDU 2008
- 题解一: #include<bits/stdc++.h>
- 题解二: 将t==0的判断放到while中
HDU 2012
- 题解一: !(x==0&&y==0)等价于x!=0||y!=0
HDU 2014
我的思路简单: 先输入数据,然后排序,然后计算
- 题解二: 找出最大值和最小值
HDU 2015
推荐题解一的代码更加简洁明了。两份题解对我的起始,不要一味最求生成向量–计算–输出的思路。同时,生成的的代码也较复杂。复现题解一
HDU 2018
我的题解是使用递归写的,n<=4,输出原值,n>5,递归
- 题解1: 把n<56的全部存到一个数组中,当n较大时,递归可能会太深
- 题解2: 不储存数据的迭代
HDU 2019
0x3f3f3f3f-表示无穷大的数,凄凉被不超过int
- 题解1: 使用m-无穷大,类似于标签—我改变了一下,在仓库中
它的题解的输入和输出如下时,无法通过
但是HDU oj中没有这个案例,是不是不需要考虑这种情况?
HDU 2020
- 题解12:提醒sort(…,cmp)自定义部分
HDU 2021
我的思路很朴素: 先换大的,再换小的
- 题解2: 使用数组和循环避免了我的超长部分(使用**/和***)
HDU 2023
我的痛,在这儿卡了好久,感觉思路没有啥问题,但是g++编译器过不了。最后全部用vector写的,C++编译器过了
感悟:
- 写标准的C++语法,不适用变长数组
HDU 2024
题解一二都没考虑标识符不能是关键字。
HDU 2025
推荐len来做,推荐使用for的auto &st:string
HDU 2026
- 题解一: i != 0 && s[i - 1] == ‘ ‘–值得我学习
HDU 2027
注意getchar()放在循环体内还循环体外的区别
HDU 2028
关键在于 long long
- 题解一: #define int long long
HDU 2030
汉字编码的时候字节首位是1,即<0;
我的电脑汉字占用3个字节,评测机是2个字节
HDU 2031
- 题解一: 栈+递归
HDU 2032
- 题解一二: 暴力生成,然后按照指示输出
HDU 2033
- 题解1: 使用取余和整除写得太好了
HDU 2034
- 题解一: 没有使用set2节省内存;学习了set的用法
- 题解二: 开了一个新的数组,存放A-B的结果
HDU 2035
- 题解一: 使* 和 % 进行迭代,非常简洁的
HDU 2036
我的思路是分解多边形+海伦公式,最后WA。提醒:海伦公式对于非凸四边形的计算有难度(如: 五角星)
- 题解一: 多边形面积公式(分析:hdu 2036(多边形面积公式)-CSDN博客)
HDU 2037
我的思路是使用开头的时间排序,可能造成一个有空隙,选择总长度较长的选择。建议: 使用结束时间排序
- 题解一推荐阅读
HDU 2038
没有HDU 2038
HDU 2039
注意: 这是正数
HDU 2040
真约数分布在a/2的左侧或者分布在sqrt(a)的两侧
HDU 2041
本题递归不会超时(我的代码没有超时)
题解一二都是打表完成
HDU 2044
本题尤其注意兔子数列的增速,大约40+的时候就超出了int,需要设置为long long
HDU 2045
本题–需要递归的思考方式,但是递归会TLE,所以要写迭代的,同时,要开long long
HDU 2046
本题的迭代关系是fib的关系。
s(n)表示2*n的方案。铺骨牌的方式由两种竖着铺一张和横着铺两张。因此s(n)=s(n-1)*1+s(n-2)*2;
HDU 2047
本题的迭代关系时f(n)=f(n-1)*2+f(n-2)*2.通过将最后一位是非为O,进行分类计算
HDU 2048
错位排列
HDU 2049
本体与上一题类似进加入一个组合数的运算
由于后续的答案较大,容易造成溢出,然后WA
HDU 2050
直线问题:
- 内部区域的个数1+2+3+….+N-2
- 外部区域的个数2*N
- 总个数(N*N+N)/2+1
折线问题:(n是折线的个数)
- 个数: f(n)=f(n-1)+4(n-1)+1;
- zn*n-n+1
HDU 2054
大数字符串问题
不需要考虑前导0,不需要考虑有符号数
很抽象,这是道字符串题目,我思考的第一个版本一致WA$HDU 2054_1.CPP$ ,但是是比AC的$HDU 2054$考虑更加全面的
HDU 2057
这道题是计算16进制数的和。我觉得会是大数,就像使用字符串写。同号用while+stack实现出ans,异号先算出符号,再迭代+stack计算ans;ans去除前置0就是正真的答案。代码在HDU 2057.cpp 。结果是WA
https://blog.csdn.net/qq_40967787/article/details/89440209
总结
条件输入
cin>>a
scanf(“…”)==EOF
printf和cout
- printf:非常适合指定小数点后位数的输出
- cout:非常合适简单的输出
cin和scanf
- cin:非常适合简单的输入,作为while的输入
- scanf:非常适合有指定格式的输入
set
set的抽象含义: 一个自动排序且不含重复元素的容器
set的访问: 仅支持迭代器的使用且不支持< >等元素符号
HDU 2037和HDU 2021的共同点
贪心算法:
- 局部最优导致全局最优解
- 预处理: 合理的排序
- 线性遍历即可完成决策
四舍五入(两位小数)
- printf(“%..f”)
- int((a*100+0.5)/100)
- << setprecision(2) <<
- 标题: HDU 100:两个月挑战
- 作者: Ttzs
- 创建于 : 2025-05-08 20:05:05
- 更新于 : 2025-06-06 20:14:25
- 链接: https://ttzs-git.github.io/2025/05/08/HDU-100-两个月挑战/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。