题目链接
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;
}
总结
唉,这么简单的一道题比赛的时候往数学方向想了,没去想是否可以暴力实现
别人都写出来我一直写不出直接导致心态崩了