2007-2008 ACM-ICPC, NEERC, Southern Subregional Contest J

来源:互联网 发布:中国期货数据 编辑:程序博客网 时间:2024/05/26 08:42

题目链接

http://codeforces.com/gym/101503/attachments

题目大意

输入一个n(1 <= n <= 10 000), 让你给1~n这n个数进行染色,对于任意数A和B,如果A能整除B, 那么这两个数字就不能染成同一种颜色
问你给n个数染色最少需要几种颜色

思路

由于n不大,直接暴力就好了,对于每一个数字,我们往前面找,找到符合条件的颜色
这里有个小优化,如果直接枚举颜色去找会超时,我们可以用set把一个数不能涂颜色放进它对应的set里面,这样枚举颜色的时候就可以log(n)复杂度判断该颜色是否可用了

代码

#include<bits/stdc++.h>using namespace std;int ans[10005];set<int>c[10005];int main(){    int n, tot = 1;    scanf("%d", &n);    ans[1] = 1;    for(int i=1; i<=n; ++i)        c[i].insert(1);    for(int i=2, j; i<=n; ++i)    {        for(j=1; j<=tot; ++j)        {            if(c[i].find(j) == c[i].end())            {                ans[i] = j;                break;            }        }        if(j == tot+1) ans[i] = ++tot;        for(j=i+i; j<=n; j+=i)            c[j].insert(ans[i]);    }    printf("%d\n", tot);    for(int i=1; i<=n; ++i)        printf("%d%c", ans[i], " \n"[i==n]);    return 0;}

总结

唉,这么简单的一道题比赛的时候往数学方向想了,没去想是否可以暴力实现
别人都写出来我一直写不出直接导致心态崩了

阅读全文
0 0
原创粉丝点击