BestCoder Round #38 1002.Greatest Greatest Common Divisor

原题链接:

http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=577&pid=1002

Greatest Greatest Common Divisor

 
 Accepts: 271
 
 Submissions: 1138
 Time Limit: 4000/2000 MS (Java/Others)
 
 Memory Limit: 65536/65536 K (Java/Others)
Problem Description

Pick two numbers ai,aj(ij) from a sequence to maximize the value of their greatest common divisor.

Input

Multiple test cases. In the first line there is an integer T, indicating the number of test cases. For each test cases, the first line contains an integer n, the size of the sequence. Next line contains n numbers, from a1 to an1T100,2n105,1ai105. The case for n104 is no more than 10.

Output

For each test case, output one line. The output format is Case #xansx is the case number, starting from 1ans is the maximum value of greatest common divisor.

Sample Input
2
4
1 2 3 4
3
3 6 9
Sample Output
Case #1: 2
Case #2: 3


题意:和简单,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;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章