正经题解
2026-09-26 01:22:34
发布于:江苏
1阅读
0回复
0点赞
正常写法:
#include <bits/stdc++.h>
using namespace std;
long long a[1010];
long long maxn=1;
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){//一个一个的枚举
for(int j=1;j<=n;j++){//直接O(n^2)了,太慢了
if(__gcd(a[i],a[j])==1){
maxn=max(a[i]+a[j],maxn);
}
}
}
cout<<maxn;
return 0;
}
但是代码还能再优化
就像下面这样
#include <bits/stdc++.h>
using namespace std;
long long a[1010];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+n+1);//先用sort排下序
for(int i=n;i>=1;i--){//从最大的开始枚举
for(int j=i-1;j>=1;j--){//自己和自己不用判断
if(a[i]%2==0&&a[j]%2==0)continue;//排除二者都是偶数
if(__gcd(a[i],a[j])==1){
cout<<a[i]+a[j];
return 0;//找到最大直接跳出
}
}
}
return 0;
}
上面的代码最好一次结束,最坏n2,但肯定比直接两层循环n次快,上面的最起码还有最好和最坏,直接两层只能老老实实n2
坚持手搓gcd!!!!!!!!!代码:
long long gcd(long long a,long long b){//a为a和b中的较大数,b为较小数
if(b==0)return a;
return gcd(b,a%b);
}
这里空空如也



有帮助,赞一个