Example
input
4
6
48 13 22 -15 16 35
8
-1 0 1 -1 0 1 -1 0
4
100 -1000 -1000 -1000
4
1 1 1 1
output
13
2
-1
-1
题意:
给n个数,可以每个数进行a[i]-k的操作。在操作后,使至少一半的数相同,求k最大是多少
思路:
和d1的k一样,都是所有差值的最大公约数,所以k有可能是任何差值的因子,我们把所有的因子存贮遍历,求最大
//学长yyds
int a[maxn];
int main(){
int T = read();
while(T--){
int n = read();
int m=n/2;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+1+n);
int aa=1,mx=0;
a[n+1]=inf;
for(int i=1;i<=n;i++){
if(a[i]!=a[i+1]){
mx=max(mx,aa);
aa=1;
}
else aa++;
}
//cout<<"aa="<<aa<<"\n";
if(mx>=m) {
cout<<"-1\n"; continue;
}
set<int>cun,yin;
for(int i=1 ;i<=n ;i++)
{
for(int j=i+1 ;j<=n ;j++)
{
cun.insert(abs(a[i]-a[j]));//把差值全放进去
}
}
for(auto i:cun)
{
for(int j=1 ;j*j<=i ;j++)
{
if(i%j) continue;
yin.insert(j);
yin.insert(i/j);//和d1一样,k是差值的最大因子,所以每个数的因子都有可能是k,全存进去遍历
}
}
int ans=1;
for(auto j:yin){//ohhh~开始啦
for(int i=1 ;i<=m+1 ;i++)
{
int t=1;
for(int k=i+1 ;k<=n ;k++)
{
int num = a[k] - a[i];
if(num%j==0) t++;
}
if(t>=m)
{
ans = j;
}
}
}
cout<<ans<<"\n" ;
}
}
革命啊啊啊