寒假训练赛Ⅰ 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;
}
发布了32 篇原创文章 · 获赞 0 · 访问量 632

猜你喜欢

转载自blog.csdn.net/weixin_45794203/article/details/104027078
今日推荐