1221:分成互质组
【题目描述】
给定n个正整数,将它们分组,使得每组中任意两个数互质。至少要分成多少个组?
【输入】
第一行是一个正整数n。1 ≤ n ≤ 10。
第二行是n个不大于10000的正整数。
【输出】
一个正整数,即最少需要的组数。
【输入样例】
6
14 20 33 117 143 175
【输出样例】
3
分析
- 互质数:两个数的最大公约数为1,那么这两个数互质,所以我们要有一个求两个数最大公约数的函数gcd;
- 关于几个互质的数怎么放一组,怎么判断一个数是否可以放在该组,我采用了一个group数组,去存放某一组的所有数的乘积,如果需要判断的数和这个组的乘积都互质,那么与该组所有的数都互质。
- 关于求分组的问题,我们采用逐个去判断,在处理第step个数的时候,我们逐个与前面的gro组进行判断,看看有没有可以放在其中的组,如果没有的话我们新创一个组,去搜索下一个数,再让其判断前面的gro个组,看看有没有合适的…
- 关于范围,由于每个数最大10000,如果一组有五六个这样的数,那么int就会爆,所以在求gcd以及group数组要定义为long long类型
- 细节性问题:要注意初始化group数组,而且在判断第step个数可以放在哪一组的时候,我们要让i从1开始( i 就是遍历gro个组的),因为我们搜索的时候默认有第一组,而不能习惯性从第0组搜索(那就把第gro组漏了没去判断),然后就会造成结果不对;
#include <bits/stdc++.h>using namespace std;
const int N = 25;
typedef long long ll;int arr[N];
ll group[N];//记录每组的乘积
int n, ans = 15;//最大公约数
ll gcd(ll a, ll b) {return b == 0 ? a : gcd(b, a % b);
}//gro:当前一共分了gro组;step:当前正在处理第几个数
void dfs(int gro, int step) {//最后一个数也已经分好组了if (step == n) {ans = min(ans, gro);return;}//看看step这个索引的数,能不能放在gro个组中,不能的话,创建一个新组//i从1到<=gro;而不是从0到<grofor (int i = 1; i <= gro; ++i) {//第step这个数,能分在当前第i组if (gcd(arr[step], group[i]) == 1) {//表示当前第step个数与第gro组的数都互质group[i] *= arr[step];//去搜下一个数dfs(gro, step + 1);group[i] /= arr[step];}}//前gro组都放不下它,需要新创建一组group[gro + 1] *= arr[step];dfs(gro + 1, step + 1);group[gro + 1] /= arr[step];
}int main() {cin >> n;for (int i = 0; i < n; ++i) {cin >> arr[i];group[i] = 1;}//这样是错误的,不能初始为1//memset(group, 1, sizeof(group));//排不排序都可以sort(arr, arr + n);dfs(1, 0);cout << ans;return 0;
}
1221:分成互质组相关推荐
- 信息学奥赛一本通(1221:分成互质组)
1221:分成互质组 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 7405 通过数: 3453 [题目描述] 给定n个正整数,将它们分组,使得每组中任意 ...
- 小学奥数 7834 分成互质组 python
http://noi.openjudge.cn/math/7834/ 参考: 信息学奥赛一本通(1221:分成互质组) https://blog.csdn.net/lvcheng0309/articl ...
- C++递归算法之分成互质组
分成互质组 Description 给定n个正整数,将它们分组,使得每组中任意两个数互质.至少要分成多少个组? Input 第一行是一个正整数n.1 <= n <= 10. 第二行是n个不 ...
- POJ 7834:分成互质组
" Ctrl AC!一起 AC!" 原题:忘题戳这 分析:对于一个数,遍历所有的互质组,如果可以进入一个组,并保持组内互质,则总组数不变.否则总组数加一. AC代码: #inclu ...
- 分成互质组 (信息学奥赛一本通-T1221)
[题目描述] 给定n个正整数,将它们分组,使得每组中任意两个数互质.至少要分成多少个组? [输入] 第一行是一个正整数n.1 ≤ n ≤ 10. 第二行是n个不大于10000的正整数. [输出] 一个 ...
- AcWing 1118. 分成互质组
题意: 给定 n 个正整数,将它们分组,使得每组中任意两个数互质. 问:至少要分成多少个组? 思路: dfs,对每一个元素,我们有两种操作: ①:放到现有组中的最后一组中(依次枚举最后一组的所有元素, ...
- 1118. 分成互质组
给定 n 个正整数,将它们分组,使得每组中任意两个数互质. 至少要分成多少个组? 输入格式 第一行是一个正整数 n. 第二行是 n 个不大于10000的正整数. 输出格式 一个正整数,即最少需要的组数 ...
- 【noi 2.5_7834】分成互质组(dfs)
有2种dfs的方法: 1.存下每个组的各个数和其质因数,每次对于新的一个数,与各组比对是否互质,再添加或不添加入该组. 2.不存质因数了,直接用gcd,更加快.P.S.然而我不知道为什么RE,若有好心 ...
- OpenJudge 7384(分成互质组)
应hfu要求,近几日整理搜索专题的内容,无意中翻出了一年前死活A不掉的一道不可做题(当时觉得).看着自己的代码风格变化天翻地覆,无奈感叹时间飞逝...算了少矫情管他的先A了再说(ง •̀_•́)ง 先 ...
最新文章
- java 找不到符号变量_java编程找不到符号
- innerHTML outerHTML innerText
- docker 不包含依赖 打包_从零开始学K8s: 4.Docker是什么
- 获取日期对应的财务期间
- Ajax 模糊查询的简单实现
- F. It‘s a bird! No, it‘s a plane! No, it‘s AaParsa!
- 作者:李俊清,山东农业大学副教授。
- 项目配置不当引发了数据泄露,人已裂开!!
- 来自数据库的MVC 6动态导航菜单
- boot定时任务开启和关闭 spring_Spring-Boot 下定时任务通过配置文件控制开关和执行时间...
- java jnlp_Java Web Start 与jnlp结合实例讲解
- c语言出100道计算题,C语言例题100道
- simulink 状态空间加反馈报错
- (学习笔记)图像处理——Retinex增强
- NWR,Gossip,Paxos分布式一致性协议
- 计算机断层CT检查肺部混浊,揪出早期肺癌 低剂量电脑断层检查
- turf.js字典——查询turf库的所有方法及用途
- 什么是REST ful?
- 【Tools】抓包工具——Charles(中名:花瓶)
- python开发工程师是干嘛的-python开发工程师是做什么的
热门文章
- [ VRTK ] --- 学习日记01
- 谷歌浏览器无法翻译一分钟解决
- js将json自动转html表格实例
- android ip格式化输入法,手机键盘还能这样玩?简单几步,让你的输入法萌动可人!...
- 按钮(UIButton)的用法
- android在浏览器中打开,在android浏览器中打开一个链接(WebView)
- android浏览器修改文字,TextOnly:简洁“文字版”Android浏览器
- css实现右下角√对号选中样式——基础积累
- TCP三次握手四次分手不一样的解释
- golang实现httphttps代理服务器