原題鏈接:
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;
}