HDU 100:两个月挑战

Ttzs Lv1

情况

大一学了C++的基础知识和极其少的stl内容,没学数据结构与算法

刷HDU的2000-2099 检测一下C++的情况

每天**1.5h(3~4题)**的刷题,以及不限制限制时间的反思

半个小时,不会就跳,结束后复盘

我的代码仓库:https://github.com/Ttzs-Git/learning-logs/

具体位置: /learning-CPP-language/cpp-algo

可能常用网站

HDU OJ

题解1

题解2

解题反思

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-无穷大,类似于标签—我改变了一下,在仓库中

它的题解的输入和输出如下时,无法通过image-20250509232346551

但是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。提醒:海伦公式对于非凸四边形的计算有难度(如: 五角星)

image-20250514151941109

HDU 2037

我的思路是使用开头的时间排序,可能造成一个有空隙,选择总长度较长的选择。建议: 使用结束时间排序

  • 题解一推荐阅读

HDU 2038

没有HDU 2038

HDU 2039

注意: 这是正数

HDU 2040

真约数分布在a/2的左侧或者分布在sqrt(a)的两侧

HDU 2041

本题递归不会超时(我的代码没有超时)

题解一二都是打表完成

HDU 2044

本题尤其注意兔子数列的增速,大约40+的时候就超出了int,需要设置为long long

image-20250515162059074

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

错位排列

image-20250518184611571

image-20250518184740228

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 进行许可。
评论