蓝桥杯宝石,考察数学。考察公式推导能力
这个题考察纯数学推导,我不会,但是可以解释别人的代码
大体思路是先化简公式,最后得知s与a,b,c的最大公约数有关
所以我们的目标就是要寻找最大公约数,并且要找到三个数,所有我们要从大到小枚举所有最大公约数的可能。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
vector<int> q;
map<int,int> mp;//为什么用map因为可能存在多个饱食度相同的情况如1 2 2 2 3
int b;
for(int i=0;i<n;i++)
{
cin>>b;
q.push_back(b);
mp[b]++;
}//到这里都是输入数据的处理
sort(q.begin(),q.end());//进行排序我们要寻找最大公约数,数组里面的每个数都可能是最大公约数
int xx=q.size()-1;
for(int i=q[xx];i>=1;i--)//从后往前枚举
{
int now[3];//我们需要找到三个数,题目要求
int pos=0;
for(int j=i;j<=q[xx];j+=i)//重点,枚举的边界是最大的宝石度,更大就没必要了,j+=i为什么呢。注意我们寻找的是以最大公约数为开头的三个数,要保证该数是最大公约数,就要让后面两个数是它的倍数。
{
if(mp[j]>0)//判断该数是否存在
{
int cont=mp[j];/将数存下来,下面应该都看的懂
while(cont--)
{
now[pos++]=j;
if(pos==3)
{
cout<<now[0]<<" "<<now[1]<<" "<<now[2];
return 0;
}
}
}
}
}
}