正题
发现随机到一个答案集合内的数是的,那么我们随机化多次,每次暴力枚举m进行检验即可。
若随机化T次,不成功的几率是,除非你背,随机100次肯定没有问题。
#include<ctime>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std;
const int N=1e6+10;
int n,mmax;
int a[N];
int A[N];
bool tf[N];
int main(){
srand(time(0));
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]),A[a[i]]++,mmax=max(mmax,a[i]);
int T=min(100,n);
int maxans=0;
while(T--){
int x=rand()*rand()%n+1;
while(tf[x]) x=rand()*rand()%n+1;
int t=a[x],tot=0;
for(int m=100000;m>=1;m--){
tot=0;
for(int i=t%m;i<=mmax;i+=m)
tot+=A[i];
if(tot>=(n+1)/2){
maxans=max(maxans,m);
break;
}
}
}
printf("%d\n",maxans);
}
本文介绍了一种利用随机化算法寻找一组数中能够将至少一半的数整除的最大数的方法。通过多次随机选取元素并枚举可能的除数,算法能够在较短的时间内找到满足条件的最大数。代码实现使用了C++语言。
304

被折叠的 条评论
为什么被折叠?



