- 贪心。猜测最优方案一定可以满足至多只有一个集合的大小不为1
点击查看代码
#include <bits/stdc++.h>
using namespace std;
int a[1000005];
int cnt[1000005];
vector<int>c[1000005];
vector<long long>s[1000005];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int T;
cin>>T;
while(T--)
{
int n,k;
cin>>n>>k;
int maxn=0;
long long sum=0,ans=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
cnt[a[i]]++;
maxn=max(maxn,a[i]);
sum+=a[i];
}
for(int i=1;i<=maxn;i++)
{
for(int j=i;j<=maxn;j+=i)
{
for(int k=1;k<=cnt[j];k++)
{
c[i].push_back(j);
if(s[i].empty())
{
s[i].push_back(j);
}
else
{
s[i].push_back(s[i].back()+j);
}
}
}
}
for(int i=1;i<=maxn;i++)
{
if(c[i].size()&&c[i].size()+k-1>=n)
{
ans=max(ans,sum-s[i][n-k]+i);
}
}
cout<<ans<<"\n";
for(int i=1;i<=maxn;i++)
{
c[i].clear();
s[i].clear();
cnt[i]=0;
}
}
return 0;
}