原题链接:
http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=577&pid=1002
Greatest Greatest Common Divisor
题意:和简单,n个数,求其中任意两个数的最大公约数的最大值。
思路:100000的复杂度,肯定是n,nlogn或者n根号n可能都能过。
从最大数nmax开始从大到小枚举x,如果存在两个及以上数都是x的倍数的话,x就是答案了。复杂度nlogn。
注意:可能会有重复的数字出现,所以存放val[num]的时候,不能用只用1,0,需要存放具体个数。
一开始想到了这个做法,但是觉得会超时。这种问题一直不能想的很透彻为什么是nlogn的复杂度,总觉得最坏是n*n,后来看了题解才知道可以这样做。
代码:
#include "stdio.h"
#include "iostream"
#include "string.h"
#include "stdlib.h"
#include "algorithm"
#include "math.h"
#include "map"
#include "queue"
#include "stack"
using namespace std;
const int INF=0x3f3f3f3f;
const int MAXN=100005;
typedef long long LL;
int T,n,val[100010],cnt,nmax,ans;
int main()
{
int a;
cin>>T;
for(int i=1;i<=T;i++)
{
scanf("%d",&n);
nmax=-1;
ans=0;
memset(val,0,sizeof(val));
while(n--)
{
scanf("%d",&a);
val[a]++;
nmax=max(nmax,a);
}
for(int i=nmax;i>=1&&ans==0;i--) //以i为最大公约数假设
{
cnt=0;
for(int j=i;j<=nmax;j+=i) //枚举i的1倍,2倍等
{
if(val[j])
cnt+=val[j];
if(cnt>=2)
{
ans=i;
break;
}
}
}
printf("Case #%d: ",i);
printf("%d\n",ans);
}
return 0;
}