关闭

codeforce 582 A. GCD Table

112人阅读 评论(0) 收藏 举报
分类:

显然矩阵中最大的那个数就是要求的数组中最大的那个数,所以首先把这个最大的数放到数组里去。

这里用 set 来存放矩阵中的数,因为 set 有插入数据时自动排序的功能,而且我们每次要取的数都是 set 中最大的数,所以用这种数据结构很方便。

取完第一个数后,要把这个数从 set 中删除,接下来的就是一个循环取最大数的过程了。

循环过程:

每取完一个最大数,先把这个数从set  中删除,然后删除所有已经取出来的数(也就是已经放到要求的数组中的数)和这个数的公因子,记住这里每个公因子要删两次,因为矩阵中本来就有重复的,比如 4 和 6 的最大公因子为2,矩阵中有 4 和 6 的公因子,也有 6 和 4 的公因子,而这两个值是一样的,由于set 自动排序,所以这两个相同的数肯定是挨着的,所以删的时候,连删两个就行。

代码如下;

#include <iostream>
#include <set>
using namespace std;
multiset<int> st;
int re[500];
int gcd(int m,int n)
{
	int r=m%n;
	while(r!=0)
	{
		m = n;
		n = r;
		r=m%n;
	}
	return n;
}
int main() 
{
	int n,nn,i,x,k=0;
	cin>>n;
	nn=n*n;
	for(i=0;i<nn;++i)
	{
		scanf("%d",&x);
		st.insert(x);
	}
	set<int>::reverse_iterator rit=st.rbegin();// 取最大的数 
	re[k++]=*(rit++);
	st.erase(rit.base());  // 删除这个最大数 
	set<int>::iterator beg;
	while(k<n)
	{
		rit=st.rbegin();  //循环取最大数 
		re[k]=*(rit++);   
		st.erase(rit.base());  // 删除这个最大数 
		for(i=0;i<k;++i)   //  对所有之前已经取完的数 
		{
			x = gcd(re[i],re[k]);   // 删除它们的最大公因子 
			beg=st.lower_bound(x);
			beg=st.erase(beg);   //删两次 
			st.erase(beg);
		}
		++k;
	}
	for(i=0;i<n;++i)
		printf("%d ",re[i]);
	return 0;
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:3543次
    • 积分:256
    • 等级:
    • 排名:千里之外
    • 原创:23篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档