问题描述
在一个神秘的森林里,住着一个小精灵名叫小蓝。有一天,他偶然发现了一个隐藏在树洞里的宝藏,里面装满了闪烁着美丽光芒的宝石。这些宝石都有着不同的颜色和形状,但最引人注目的是它们各自独特的 “闪亮度” 属性。每颗宝石都有一个与生俱来的特殊能力,可以发出不同强度的闪光。小蓝共找到了 N 枚宝石,第 i 枚宝石的 “闪亮度” 属性值为 Hi,小蓝将会从这 N 枚宝石中选出三枚进行组合,组合之后的精美程度 S 可以用以下公式来衡量:
其中 LCM 表示的是最小公倍数函数。
小蓝想要使得三枚宝石组合后的精美程度 S 尽可能的高,请你帮他找出精美程度最高的方案。如果存在多个方案 S 值相同,优先选择按照 H 值升序排列后字典序最小的方案。
输入格式
第一行包含一个整数 N 表示宝石个数。
第二行包含 N 个整数表示 N 个宝石的 “闪亮度”。
输出格式
输出一行包含三个整数表示满足条件的三枚宝石的 “闪亮度”。
样例输入
5
1 2 3 4 9
样例输出
1 2 3
评测用例规模与约定
对于 30% 的评测用例:3≤N≤100,1≤Hi≤1000 。
对于 60%的评测用例:3≤N≤2000 。
对于 100% 的评测用例:3≤N≤,1≤Hi≤
。
1.化简公式
①根据公式直接化简:
②推导:
(下面Ha、Hb、Hc表示为H1、H2、H3)
将H1、H2、H3表示成数字相乘的形式,a为H1、H2、H3的最大公约数,b为H1、H2的最大公约数,c为H1、H3的最大公约数,d为H2、H3的最大公约数,efg是H1、H2、H3各自的一部分
H1=abce H2=abdf H3=acdg
S=*
=a
最后的结果就是这三个数的最大公约数
25分代码:(暴力)
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e5+10;
int n, a[N];
int max1; //max 是标准库 <algorithm> 中定义的一个函数模板
int ans[3];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=1; i<=n; ++i) cin>>a[i];
for(int i=1; i<=n; ++i)
{
for(int j=i+1; j<=n; ++j)
{
for(int k=j+1; k<=n; ++k)
{
if(i!=j && j!=k && i!=k)
{
int temp = __gcd(a[i], __gcd(a[j], a[k]));
if(temp > max1)
{
max1 = temp;
ans[0]=a[i], ans[1]=a[j], ans[2]=a[k];
}
}
}
}
}
sort(ans, ans+3);
cout<<ans[0]<<" "<<ans[1]<<" "<<ans[2];
return 0;
}