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. 自测数据(边界值,特殊值, 本题中有特殊值了)
完结撒花

浙公网安备 33010602011771号