CodeForces - 583C. GCD Table

>>原题链接

题意:

一列数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)



    如有纰漏,恳请指正。( ´°̥̥̥̥̥̥̥̥ω°̥̥̥̥̥̥̥̥`)





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值