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;
}



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