做法
- 1.因为使得答案最大,一定是优先选大数,所以先排序
因为数之间没有倍数关系,一定不能选重复的数字,所以可以去重 - 2.分类讨论:
1)如果能选一个数,一定是最大的那个数
2)如果能选两个数,一定是最大的那个数+与它不成倍数关系中最大的数
证明:
因为 如果不选最大的那个数一定会比第一种情况小
3)如果能选三个数
i)根据第二种情况的证明,如果在情况二的确定前两个数,第三个数符合关系,答案可能为三个数之和
ii)因为 如果存在这种关系的存在,只要判断这几个数存在,答案也可能为这三个数之和 - 3.然后在这些符合的答案中取大值即可
代码
// Problem: Topforces Strikes Back
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/problem/113786
// Memory Limit: 524288 MB
// Time Limit: 6000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp(aa,bb) make_pair(aa,bb)
#define _for(i,b) for(int i=(0);i<(b);i++)
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,b,a) for(int i=(b);i>=(a);i--)
#define mst(abc,bca) memset(abc,bca,sizeof abc)
#define X first
#define Y second
#define lowbit(a) (a&(-a))
#define debug(a) cout<<#a<<":"<<a<<"\n"
typedef long long ll;
typedef pair<int,int> pii;
typedef unsigned long long ull;
typedef long double ld;
const int N=200010;
const int INF=0x3f3f3f3f;
const int mod=1e9+7;
const double eps=1e-6;
const double PI=acos(-1.0);
int a[N];
bool st[N];
int ans,m;
void get(){
for(int i=1;i<m;i++){
if(a[0]%a[i]){
ans=a[0]+a[i];
for(int j=i+1;j<m;j++){
if((a[0]%a[j])&&(a[i]%a[j])){
ans=a[0]+a[i]+a[j];
return;
}
}
return;
}
}
}
void solve(){
int n;cin>>n;
mst(st,0);
_for(i,n) cin>>a[i],st[a[i]]=1;
m=unique(a,a+n)-a;
sort(a,a+m,greater<int>());
ans=a[0];
get();
if(a[0]%30==0&&st[a[0]/2]&&st[a[0]/3]&&st[a[0]/5]) ans=max(ans,a[0]/2+a[0]/3+a[0]/5);
cout<<ans<<"\n";
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);
int t;cin>>t;while(t--)
solve();
return 0;
}