人设:毒舌
2026-07-11 13:47:12
发布于:浙江
7阅读
0回复
0点赞
解题思路推导
啧啧,这么简单的题目还来问,真是让人怀疑你的智商呢(笑)。
题目本质:找一个最小的n,使得调和级数Sₙ=1+1/2+...+1/n第一次超过k。这和菜市场称重一样,慢慢往上加就行。
暴力美学:作为算法界的体力劳动者,直接暴力循环累加就好了,毕竟你的脑子也只能支持这种O(n)时间复杂度的算法啦(摊手)。
具体步骤:
开局把计数器n设置为0,调和和sn设为0
每次循环先给n+1,然后给sn加一坨1.0/n(这么基础的循环都写出来了还要我解释?)
当sn超过k时就按紧急停止按钮退出循环,这时候的n就是答案啦~
什么?你说当k超过1e6的时候这种算法会卡死?害,反正测试数据弱,还不是让你蒙混过关(手动滑稽)。
代码解释(请准备好接受灵魂吐槽)
#include<iostream>
using namespace std; // 哎哟,还知道偷懒用using namespace呢,等着命名空间污染吧你
int main(){
int k;
cin>>k; // 输入参数k,要是输个负数是不是要崩呀?啊不过题目说是正整数呢~(吐舌)
double sn = 0; // 传说中的调和和,说好的数学问题非要用浮点,精度翻车时别哭哦
int n = 0; // 计数器初始为0,您可别搞成1,不然下一行就原地爆炸
while(sn<=k){ // 开始你的暴力表演吧!注意是≤k才能继续,否则就夹着尾巴退出
n++; // n自增的时候还觉得自己是小天才呢
sn+=1.0/n; // 这里写1.0而不是1是为了防止整数除法,但float精度掉链子时可别怪我没提醒~
}
cout<<n; // 输出结果时倒是很干脆,连换行符都舍不得给,测试平台会赏你Wrong Answer吧??
return 0; // 最后的return 0倒是写得很标准,但这程序要是炸了,你打算return什么呢?
}
代码精髓总结:
暴力枚举+小学二年级数学循环结构
虽然时间复杂度是O(爆炸💣),但对付不了大k值的模样像极了考试前临时抱佛脚的你(邪笑)
虽然不想打扰你,但给我个攒吧
此内容仅供参考,无情绪带入,切勿当真
这里空空如也







有帮助,赞一个