寒假訓練賽Ⅰ B題

B. Divisors of Two Integers

題目鏈接
題目大意:給出一組由x的所有除數和y的所有除數組成的數組,求x和y的值。
思路:先給數組排序,首先可以知道最大的數就是其中一個解,記爲x,然後用桶來存能被x整除的數的下標,標記爲1。例如第i個能被x整除,即標記b[i]=1,然後如果b[i+1]=b[i]的話,就會把b[i+1]也變爲1,這樣是錯誤的,所以需要再開一個數組來記錄,防止重複標記相同大小的數,使得b記錄的位置上的數都不相同,剩餘未進入桶b的相應位置的數就是另一個數的除數,最大的那個就是結果了。(一開始打算枚舉每個數,但是方法不對,折磨了我好久= =)。
代碼

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[140],b[10005],v[10005];//b桶存的是位置!
int main(){
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	sort(a,a+n);
	memset(b,0,sizeof(b));
	memset(v,0,sizeof(v));
	int m=a[n-1],p=0;
	b[n-1]=1;//存最大的數。
	v[m]=1;
	for(int i=0;i<n-1;i++){
		if(m%a[i]==0&&v[a[i]]==0){
			b[i]=1;
			v[a[i]]=1;//標記。這樣子可以保證數組中,存在數值相同的兩個數,只有一個的位置被存進b。
		}
	}
	int v[140],max=-1;
	for(int i=0;i<n-1;i++){
		if(b[i]==0){
			if(max<a[i]) max=a[i];//找沒被b桶收集的且數值最大的。
		}
	}
	printf("%d %d",m,max);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章