题意:
一列数a[n]分别两两取GCD组成一个n*n的矩阵,要求读入乱序的矩阵数字,还原出原数列。
解题思路:
两个数的GCD肯定是小于或等于较小的那个数的,所以可以联想到排序,从大到小去筛选。每选中一个符合条件的数,于是这个数字,和已经选出的数列里,每项进行GCD得到的结果,是该剔去的,观察矩阵可以知道,每个GCD结果都应该剔去两个。所以可以联想到用map做一个统计,然后一次遍历即可得解。
代码实现:
#include<stdio.h>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
int a[505*505];
int main()
{
int n;
while(~scanf("%d",&n))
{
n=n*n;
map<int,int> sum;//统计个数
vector<int> ans;//记录答案
for(int i=0;i<n;i++)
scanf("%d",&a[i]),sum[a[i]]++;//读入并统计
sort(a,a+n);//排序,默认升序
for(int i=n-1;i>=0;i--)
{//从大到小开始遍历
if(sum[a[i]]>0)
{
printf("%d ",a[i]);
sum[a[i]]--;//选中的数
for(int j=0;j<ans.size();j++)
sum[__gcd(a[i],ans[j])]-=2;
//选中的数与已得到的数列进行GCD,得到的结果统计数减2
//注意“__gcd”是编译器自带的函数,最好自己写gcd
ans.push_back(a[i]);
}
}
printf("\n");
}
}
后记:
学长的代码好难看懂啊( ´°̥̥̥̥̥̥̥̥ω°̥̥̥̥̥̥̥̥`)做这个陷入绝望。
另外我发现一些还不理解的细节:
-CF的GNU C++14编译器-
不加return 0;比加上要快
多组输入While(~scanf())比当作单组输入快(即使题目是单组)
头文件stdio.h比cstdio快
(想知道原因.jpg)
如有纰漏,恳请指正。( ´°̥̥̥̥̥̥̥̥ω°̥̥̥̥̥̥̥̥`)