【B题】Codeforces Round #630 (Div. 2)

在这里插入图片描述
题意:
t 组样例,每组给你 n 个数,
你要做的是给这些数上色,一共只有11种颜色;
如果两个数的gcd>1的话就可以上同种颜色。
输出每个数是第几号颜色;

比赛思路:
我单纯的以为先给前11个数,分别上1-11的颜色,然后之后的每个数字,都从前11个里看一下,是不是gcd>1,如果是的话就就和那个数同种颜色。同时因为题目说11种颜色一定够用,我就心安理得的这么写了;可惜我又是自以为是了。

题解思路:
比赛的思路又是一个假算法,因为仅仅选前11个数字当做基础,每次从这11个数里选,是一种盲目的行为。
如何才是理智的行为?
选11个各具代表性的;
…因为数据范围就是1000,
2,3,5,7,11,13,17,19,23,29,31。质因子正好11个。
总之就是根据质因子来分配。没有分析的很清楚…
看代码再理解一下吧…

#include<bits/stdc++.h>
using namespace std;
 
int n,t;
vector<int> ans[1007];
int res[1007];
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    auto f=[&](int u){
        for (int i=2;i<=u;++i){
            if (u%i==0) return i;
        }
    };
    cin>>t;
    while (t--){
        cin>>n;
        for (int i=1;i<=1000;++i) ans[i].clear();
        for (int i=1;i<=n;++i){
           int u;
           cin>>u; ans[f(u)].push_back(i);
        }
        int ret=0;
        for (int i=1;i<=1000;++i){
            if (ans[i].size()){
                ++ret;
                for (auto c:ans[i]){
                    res[c]=ret;
                }
            }
        }
        cout<<ret<<"\n";
        for (int i=1;i<=n;++i){
            cout<<res[i]<<" ";
        }
        cout<<"\n";
    }
    return 0;
}
发布了62 篇原创文章 · 获赞 0 · 访问量 634

猜你喜欢

转载自blog.csdn.net/weixin_44745441/article/details/105323067