刚开始做这个题的时候也是不清楚样例
但是数学公式来的
假设 y>x (y 是 bj,x 是 bi)
x+y+gcd(x,y)= lcm(x,y)
另 gcd = d,且知道 lcm=x*y/d
x/d+y/d+1=(x/d) * (y/d)
所以 (x/d-1)*(y/d-1) = 2
所以 可以得到 y/d=3, x/d=2
即 3x=2y
根据上述推导 ,代码就出来了,对于每一个确定的 y ,去寻找数列中是否有对应的那个 x,之后此 x 变为 y,重复上述操作
这样有个问题:
1.对于每个 y 我们都要遍历一遍数组 ,时间复杂度为 O(n^2) ,所以我们可以用 map 来简化时间
以下代码是假设存在 x ,去寻找对应的 y 值,然后将 y 作为 x 的值,重复操作
const int N=3e5+5;
int n,m,t;
int i,j,k;
ll a[N];
int main()
{
//IOS;
while(~sd(n)){
map<ll,int> mp;
for(i=1;i<=n;i++) sll(a[i]),mp[a[i]]++;
sort(a+1,a+1+n);
ll ans=0,sum,tmp;
for(i=1;i<=n;i++){
sum=0,tmp=a[i];
while(mp[tmp]){
sum+=tmp*mp[tmp];
//mp[tmp]=0;
if(tmp%2!=0) break;
tmp=tmp/2*3;
}
if(sum>ans) ans=sum;
}
pll(ans);
}
//PAUSE;
return 0;
}