Luogu CF1209A Paint the Numbers题解

【问题分析】

方法一:排序后从小到大排查,因为同色的数必须要是此色中最小数的倍数,又因为小的数不可能是大的数的倍数,所以从小开始算,把后面它的倍数都标记掉。记颜色的数量。

方法二:因为数的最大小于等于100,所以可以用桶排来写,把所有数分别装入相应的桶中后,从桶1开始到桶100。如果桶内有数,把它的倍数的桶中的数全部清空。记颜色的数量。

【设计程序】

方法一:

 1 #include<bits/stdc++.h>
 2 #include<iostream>
 3 #include<stdio.h>
 4 #include<cstdio>
 5 #include<queue>
 6 using namespace std;
 7 const int N = 100 + 5;
 8 int a[N];
 9 int n, sum;
10 int main()
11 {
12     scanf ("%d", &n);
13     for (int i = 0;i < n; i++)//输入n个数
14         scanf ("%d", a + i);
15     sort(a, a + n);//排序
16     for (int i = 0;i < n; i++)
17     {
18         if (a[i] == 0)//如果已经有颜色,则开始下一个
19             continue;
20         sum++;//如果没颜色,加一种颜色
21         for (int j = i + 1;j < n; j++)//把它的倍数标掉
22             if (a[j] % a[i] == 0)
23                 a[j] = 0;
24         a[i] = 0;
25     }
26     printf ("%d", sum);//输出
27     return 0;
28 }


方法二:

 1 #include<bits/stdc++.h>
 2 #include<iostream>
 3 #include<stdio.h>
 4 #include<cstdio>
 5 #include<queue>
 6 using namespace std;
 7 const int N = 10000 + 5;
 8 int a[N];
 9 int n, t, sum;
10 int main()
11 {
12     scanf ("%d", &n);
13     for (int i = 0;i < n; i++)
14     {
15         scanf ("%d", &t);//输入数
16         a[t]++;//装入桶
17     }
18     for (int i = 1;i <= 100; i++)//每一只桶遍历过去
19     {
20         if (a[i] == 0)//如果为空
21             continue;//下一只
22         sum++;//否则加一种颜色
23         a[i] = 0;//清空这只桶
24         for (int j = 1;j <= 100 / i; j++)//找是它的倍数的桶
25             a[i * j] = 0;//清空
26     }
27     printf ("%d", sum);//输出
28     return 0;
29 }

 


【代码调试】

1. 测试样例

2. 自测数据(边界值,特殊值, 本题中有特殊值了)

完结撒花

posted @ 2022-01-08 13:16  睡不醒的凪  阅读(29)  评论(0)    收藏  举报