牛客网 - [北京信息科技大学第十一届程序设计竞赛]kotori和素因子(素筛+DFS)
发布日期:2021-07-01 00:18:56
浏览次数:2
分类:技术文章
本文共 1521 字,大约阅读时间需要 5 分钟。
题目链接:
时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld题目描述
kotori拿到了一些正整数。她决定从每个正整数取出一个素因子。但是,kotori有强迫症,她不允许两个不同的正整数取出相同的素因子。
她想知道,最终所有取出的数的和的最小值是多少? 注:若a%k==0,则称k是a的因子。若一个数有且仅有两个因子,则称其是素数。显然1只有一个因子,不是素数。输入描述
第一行一个正整数n,代表kotori拿到正整数的个数。
第二行共有n个数ai,表示每个正整数的值。 保证不存在两个相等的正整数。 1<=n<=10,2<=ai<=1000输出描述
一个正整数,代表取出的素因子之和的最小值。若不存在合法的取法,则输出-1。
输入
4
12 15 28 22 5 4 5 6 7 8
输出
17
-1
说明
样例1:分别取3,5,7,2,可保证取出的数之和最小
备注
1<=n<=10,2<=ai<=1000
解题思路
题意:每个都贡献一个素因子,保证所有的素因子互不相同,求素因子和的最小值。
思路:线性筛出1~1000之内的所有素数,然后DFS求解最小值。Accepted Code:
#includeusing namespace std;const int MAXM = 1005;const int inf = 0x3f3f3f3f;bool isprime[MAXM];int n, cnt = 0, min_ = inf, s[15], pre[MAXM], vis[MAXM];void prime() { isprime[0] = isprime[1] = true; for (int i = 2; i < MAXM; i++) { if (!isprime[i]) pre[cnt++] = i; for (int j = 0; j < cnt && i * pre[j] < MAXM; j++) { isprime[i *pre[j]] = true; if (!(i % pre[j])) break; } }}void DFS(int x, int ans) { if (x >= n) { if (min_ > ans) min_ = ans; return ; } for (int i = 0; i < cnt; i++) { if (!(s[x] % pre[i]) && !vis[pre[i]]) { vis[pre[i]] = true; DFS(x + 1, ans + pre[i]); vis[pre[i]] = false; } }}int main() { prime(); scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d", &s[i]); DFS(0, 0); if (min_ < inf) printf("%d\n", min_); else printf("-1\n"); return 0;}
转载地址:https://lzyws739307453.blog.csdn.net/article/details/94550443 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2024年05月04日 17时16分07秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
记一次Hive 行转列 引起的GC overhead limit exceeded
2019-05-01
Scala List的一些常用方法
2019-05-01
FastJson对JSON字符串、JSON对象及JavaBean之间的相互转换
2019-05-01
sparkstreaming ConcurrentModificationException: KafkaConsumer is not safe for multi-threaded access
2019-05-01
git常用指令
2019-05-01
shell中获取当前日期,下月1日,上月底,上月同期日期,比较两个日期大小
2019-05-01
java单例模式几种常见实现方式
2019-05-01
shell脚本中$0,$?,$!、$$、$*、$#、$@等的意义
2019-05-01
Linux正则表达式基础入门+扩展
2019-05-01
Java实现生产者消费者模式的三种方法
2019-05-01
Java线程池的四种拒绝策略
2019-05-01
java线程池常用的阻塞队列
2019-05-01
Lock 常用的几种方法,和作用
2019-05-01
[译]Android冰淇淋三明治ICS(4.0+)JNI局部引用的变化
2019-05-01
Google Map For Android V2 使用方法
2019-05-01
OpenGL ES四 – 光效
2019-05-01
OpenGL ES五 – 材质
2019-05-01