菇凉加油

我不牛,可是我很认真。

codeforce 582 A. GCD Table

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

这里用 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;
}


阅读更多
版权声明:本文为博主原创文章,欢迎大家转载,我们都是相互学习,共同进步。 https://blog.csdn.net/u014311181/article/details/49952163
个人分类: codeforce
上一篇codeforce 577 B. Modulo Sum
下一篇596 C. Wilbur and Points
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭