思路
根据公式数学分析可以得出结果为gcd(a,b,c)。即就是使得三个数的最大公约数最大。实战中可以写一些例子进行打表,观察规律也可以得出。
观察数据范围,可以进行逆向枚举,即直接枚举到可能的公因数,然后再去枚举在范围内它的所有倍数的个数是否足够3个的条件即可。这样从大到小开始枚举,效率较高。
#include<iostream>
#include<cstdio>
#include<map>
#include<vector>
using namespace std;
const int N = 100010;
int n;
map<int,int> mp;
int main()
{
scanf("%d",&n);
for(int i = 0; i < n; i ++)
{
int a;
scanf("%d",&a);
mp[a]++; //记录闪亮度宝石的个数
}
for(int i = N; i >= 1; i --) //对于每一个可能的公约数
{
int cnt = 0; //记录是i的倍数的个数
vector<int> res; //存储答案
for(int j = i; j <= N; j += i) //i的倍数(不可能超过N)
{
if(mp.count(j)) //如果存在
{
cnt += mp[j];
for(int k = 0; k < mp[j]; k ++)
res.push_back(j);
}
if(cnt >= 3) //判断个数是否已经足够
{
for(int k = 0; k < 3; k ++) //输出前3个即可
{
printf("%d ",res[k]);
}
return 0;
}
}
}
}