1.背景
首先我个人会写一些算法题,今晚正是如此。因为我将一道简单的问题复杂化(当然我也知道这道题不难)处于强迫症我就是要推导出来代码为什么可以这么写。。。在推导过程中我想象不到正确思想,故询问了gpt非会员版(登陆到期),正好想要对比一下与其它模型的代码分析水平。结果可想,我会在这里写文章!
2.题目
<aside> 💡
简单div2A,即正确答案是最大值-最小值,起初我认为会用到gcd,结果发现用不到,但是为什么最大值-最小值就是答案,我问了gpt让其分析问题并生成代码。
</aside>
<aside> 💡
问题理解
卡米尔卡有 (n) 只羊,每只羊有一个独特的美丽等级。卡米尔卡可以给所有羊添加一个固定的草束数 (d),然后她将选择两个羊,计算它们的美丽等级之和的最大公约数(gcd)。
目标:找到 (d) 使得两个羊的美丽等级的最大公约数最大。
关键点
- 如果卡米尔卡选择 (d) 个草束,并将每只羊的美丽等级增加 (d),那么对于两只羊 (i) 和 (j),它们的美丽等级分别为 (a_i + d) 和 (a_j + d),最终计算的是 ( \gcd(a_i + d, a_j + d) )。
- 由于 (\gcd(a_i + d, a_j + d)) = (\gcd(a_i - a_j, a_j + d)),问题的本质就是要找到美丽等级的差的最大公约数。
核心观察
- 目标是找到最大值 (d),使得 ( \gcd(a_i + d, a_j + d) ) 最大化。
- 关键在于美丽等级的差值,因此我们需要计算所有美丽等级之间差值的最大公约数。
更清晰的思路
- 排序:首先对美丽等级进行排序。
- 计算相邻元素的差:计算所有相邻元素之间的差值。
- 最大公约数:所有相邻元素之间的差值的最大公约数就是我们的答案。
为什么计算差的最大公约数?
- 假设最小美丽值为 (a_{\min}),所有羊的美丽等级加上 (d = -a_{\min}) 后都会形成新的美丽等级,使得最小的美丽等级变为 0,其他的美丽等级与其差值就是相邻元素的差。
- 我们计算所有相邻元素的差值的最大公约数,实际上就是想找到能够同时影响所有差值的最大公约数。
修正后的代码
#include <bits/stdc++.h>using namespace std;
#define int long long
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++) cin >> a[i];
// 排序
sort(a.begin(), a.end());
// 计算所有相邻元素的差的最大公约数
int g = 0;
for (int i = 1; i < n; i++) {
g = gcd(g, a[i] - a[i - 1]);
}
// 输出最大愉悦值
cout << g << '\n';
}
return 0;
}
关键步骤解释
- 排序:先将美丽等级排序,因为相邻元素之间的差更容易计算。
- 计算差值的最大公约数:通过遍历每一对相邻元素,计算它们之间的差值的最大公约数。
- 输出结果:最大公约数就是两个美丽等级的最大愉悦值。
代码分析
- 时间复杂度:
- 排序需要 (O(n \log n))。
- 遍历计算差的最大公约数需要 (O(n))。
- 总的时间复杂度是 (O(n \log n)),适合 (n \leq 100)。
- 空间复杂度:需要存储美丽等级的数组,所以是 (O(n))。
示例分析
输入:
4
2
1 3
5
5 4 3 2 1
3
5 6 7
3
1 11 10
解析:
- 第一个测试用例:
- 羊的美丽等级:1, 3
- 排序后:1, 3
- 差值:3 - 1 = 2
- 最大公约数为 2。
- 第二个测试用例:
- 羊的美丽等级:5, 4, 3, 2, 1
- 排序后:1, 2, 3, 4, 5
- 差值:2 - 1 = 1, 3 - 2 = 1, 4 - 3 = 1, 5 - 4 = 1
- 最大公约数为 1。
- 第三个测试用例:
- 羊的美丽等级:5, 6, 7
- 排序后:5, 6, 7
- 差值:6 - 5 = 1, 7 - 6 = 1
- 最大公约数为 1。
- 第四个测试用例:
- 羊的美丽等级:1, 11, 10
- 排序后:1, 10, 11
- 差值:10 - 1 = 9, 11 - 10 = 1
- 最大公约数为 1。
总结
- 本题的关键是 差值的最大公约数,而不仅仅是最大值和最小值的差。 </aside>
此上错误的回答!!!
以上可以对比我写的正确代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 110;
int t;
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>t;
while(t--)
{
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i <n; i++) cin >> a[i];
sort(a.begin(), a.end());
cout << a.back() - a.front() << endl;
}
return 0;
}
相反我问了deepseek和(Grok)也就是目前最火的三个模型。
整整一大段分析,细节的我不想去阅读,最后的代码更是简洁且正确。
3.为什么要对比非会员版
首先对于deep seek和Grok是不需要会员就可以用到最新的版本模型,R1和Grok3都是非常出色的大语言模型,由于Grok今晚服务器可能有些问题,导致不太稳定,故没有去对比,但最近的代码分析都是用Grok去做的,我认为他的思考更加详细有条理(对比gpt非会员),当然plus/pro版的gpt我认为还是目前最好的语言模型。问题就是非会员的解题能力的欠缺。毕竟如果不是团队购买plus/pro,价格还是有些昂贵(20刀)甚至pro200刀/month,当然能团队买那更加合适,用较便宜价格拿最好模型何乐而不为呢。
希望在之后会加强基础版的能力,这会是使用量的损失。