CF1209A Paint the Numbers题解
【问题分析】
方法一:排序后从小到大排查,因为同色的数必须要是此色中最小数的倍数,又因为小的数不可能是大的数的倍数,所以从小开始算,把后面它的倍数都标记掉。记颜色的数量。
方法二:因为数的最大小于等于 $100$ ,所以可以用桶排来写,把所有数分别装入相应的桶中后,从桶 $1$ 开始到桶 $100$ 。如果桶内有数,把它的倍数的桶中的数全部清空。记颜色的数量。
【设计程序】
方法一:
#include<bits/stdc++.h>
#include<iostream>
#include<stdio.h>
#include<cstdio>
#include<queue>
using namespace std;
const int N = 100 + 5;
int a[N];
int n, sum;
int main()
{
scanf ("%d", &n);
for (int i = 0;i < n; i++)//输入n个数
scanf ("%d", a + i);
sort(a, a + n);//排序
for (int i = 0;i < n; i++)
{
if (a[i] == 0)//如果已经有颜色,则开始下一个
continue;
sum++;//如果没颜色,加一种颜色
for (int j = i + 1;j < n; j++)//把它的倍数标掉
if (a[j] % a[i] == 0)
a[j] = 0;
a[i] = 0;
}
printf ("%d", sum);//输出
return 0;
}
方法二:
#include<bits/stdc++.h>
#include<iostream>
#include<stdio.h>
#include<cstdio>
#include<queue>
using namespace std;
const int N = 10000 + 5;
int a[N];
int n, t, sum;
int main()
{
scanf ("%d", &n);
for (int i = 0;i < n; i++)
{
scanf ("%d", &t);//输入数
a[t]++;//装入桶
}
for (int i = 1;i <= 100; i++)//每一只桶遍历过去
{
if (a[i] == 0)//如果为空
continue;//下一只
sum++;//否则加一种颜色
a[i] = 0;//清空这只桶
for (int j = 1;j <= 100 / i; j++)//找是它的倍数的桶
a[i * j] = 0;//清空
}
printf ("%d", sum);//输出
return 0;
}
【代码调试】
-
测试样例
-
自测数据(边界值,特殊值, 本题中有特殊值了)
完结撒花
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现