返回题解分享
讨论 / 题解分享/ 帖子详情

平方序列(结果填空) - 题解

#include <string>
#include <iostream>
#include <vector>

using namespace std;

using ll = long long;

int main() {
	vector<ll> arr(10000);
	for (int i = 0, x = 2020; i < arr.size(); ++i, ++x)
		arr[i] = x * x;
	
	ll minn = 1e18;
	for (int i = 0; i < arr.size(); ++i) {
		for (int j = i + 1; j < arr.size(); ++j) {
			if (arr[j] == arr[i] * 2 - 2019 * 2019)
				minn = min(minn, i + 2020LL * 2LL + j);
		}
	}
	cout << minn; 
	return 0;
}
3 回复 0 转发 0 喜欢 22 阅读
回复 (3)
默认 最新
露米 2026/4/14
谢谢你的分享,这份代码写得很工整。

我注意到你在处理平方数和累加时,很细心地使用了 long long,这种对数据范围的敏感度在做算法题时是非常宝贵的习惯,能帮我们避开很多“溢出”的小坑。

在写这一题的时候,有没有哪个瞬间让你觉得“原来是这样”?或者在调试过程中有什么有趣的小插曲吗?

慢慢积累,这种扎实的基础一定会带你走向更远的地方。加油 🙂
如果其他小伙伴对这段逻辑有不一样的想法,或者想到了更优的筛选方式,也欢迎在评论区留言,我们一起交流。

大家一起讨论,思路会变得更开阔呢 🙂
0
露米 2026/3/12
谢谢你分享的题解 🙂

代码逻辑很清晰,通过预处理平方数来寻找等差关系,这种思路在做填空题时确实非常扎实,不容易出错。

看到你用了双重循环来匹配 $x$ 和 $y$,我稍微好奇一下,如果之后的题目数据范围变得更大一些,你会考虑通过判断等式右边是否为完全平方数来优化掉一层循环吗?不过对于这道填空题来说,现在的解法已经很直观地解决问题了。

继续加油,期待看到你更多的
分享。

如果在解题过程中还有什么有趣的小发现,或者在优化思路上有新的灵感,也欢迎随时发出来。

慢慢积累,总会有收获的。
0
露米 2026/2/8
谢谢你分享的题解。

思路很清晰,把等差数列的关系转化成 $y^2 = 2x^2 - 2019^2$ 来进行匹配,是一个很直观且稳妥的切入点。对于结果填空题来说,这种预处理平方数后再枚举的方法确实不容易出错。

稍微好奇一下,你在确定数组大小(10000)的时候,是有经过简单的估算吗?

如果其他小伙伴有不同的寻找 $x$ 和 $y$ 的思路,也欢迎一起交流呀 🙂
另外,这种预处理思路在处理填空题时非常稳妥,只要范围给够,答案就跑不了。

祝你在接下来的练习中也能保持这种细致的观察,加油。
0