华为OJ(素数伴侣)
2015-08-25 20:17
330 查看
描述 | 题目描述 若两个正整数的和为素数,则这两个正整数称之为“素数伴侣”,如2和5、6和13,它们能应用于通信加密。现在密码学会请你设计一个程序,从已有的N(N为偶数)个正整数中挑选出若干对组成“素数伴侣”,挑选方案多种多样,例如有4个正整数:2,5,6,13,如果将5和6分为一组中只能得到一组“素数伴侣”,而将2和5、6和13编组将得到两组“素数伴侣”,能组成“素数伴侣”最多的方案称为“最佳方案”,当然密码学会希望你寻找出“最佳方案”。 输入:有一个正偶数N(N≤100),表示待挑选的自然数的个数。后面给出具体的数字,范围为[2,30000]。输出:输出一个整数K,表示你求得的“最佳方案”组成“素数伴侣”的对数。 |
---|---|
知识点 | 查找,搜索,排序 |
运行时间限制 | 10M |
内存限制 | 128 |
输入 | 输入说明 1 输入一个正偶数n 2 输入n个整数 |
输出 | 求得的“最佳方案”组成“素数伴侣”的对数。 |
样例输入 | 4 2 5 6 13 |
样例输出 | 2 |
方法一:穷举
#include <iostream> #include <math.h> #include <algorithm> using namespace std; bool Isprimer(int n) { int flag=1; if (n<2) return false; if (n==2) return true; for (int i=2;i<=sqrt(double(n));i++) if (n%i==0) { flag=0; break; } if(flag) return true; else return false; } bool Primer_patener(int x,int y) { if(Isprimer(x+y)) return true; else return false; } int main() { int N,a[100]; int max=0; cin>>N; if (N%2!=0 || N>100) return -1; for (int i=0;i<N;i++) cin>>a[i]; sort(a,a+N); while (next_permutation(a,a+N)) //穷举每一种组合 { int k=0; for(int j=0;j<N;j+=2) if (Primer_patener(a[j],a[j+1])) k++; if (max<k) max=k; } cout<<max<<endl; }
方法二:应该是动态规划的方法,谁看懂了给我讲讲,谢谢!
#include<iostream> using namespace std; int isPrime(unsigned int n) { // Code Here unsigned int i; if(n<2) { return 0; } for(i=2;i<=n/2;i++) { if(0==n%i) { return 0; } } return 1; } unsigned int CalcNum(unsigned int *Input,unsigned int InputNum) { /* 代码在这里实现 */ int i,j; unsigned int cnt; unsigned int dp[100]={0}; if((NULL==Input)||(InputNum<1)||(InputNum%2)) { return 0; } for(i=InputNum-2;i>=0;i--) { for(j=InputNum-1;j>i;j--) { cnt = isPrime(Input[i] + Input[j]) ? (dp[i + 1] - dp[j - 1] + dp[j + 1] + 1):dp[i+1];//神马意思? dp[i] = (cnt>dp[i]) ? cnt:dp[i]; <span style="white-space:pre"> </span>//上面这句不知道你是否看懂了,反正我是没看懂额 } } return dp[0]; } int main() { int n; cin>>n; unsigned int *input=new unsigned int ; for(int i=0;i<n;i++) cin>>input[i]; cout<<CalcNum(input,n); //system("pause"); return 0; }下面是从OJ上看到的别人的评论:
有人说,上面的dp解法是凑巧的,实际不对,应该用二分图。见识太少,不懂神马是二分图,~~~~(>_<)~~~~,多读书吧,少年!
相关文章推荐
- 安全驾驶-车速 (二六)
- 【POJ2912】【加权并查集】【食物链变形】【只有一个就是只有他能nobug】
- Java(十三)--Set的添加,删除,修改
- iOS之弹幕效果
- Android 内存溢出解决方案(OOM) 整理总结
- 安全驾驶-提神利器(二五)
- 和财富 v1.0.8 安卓版
- tableView上添加手势 & 在cell 上添加快捷菜单
- spray-caching缓存结果
- Nginx基础篇之二—Nginx简单的HTTP程序
- 简单的同步
- Linux系统线程同步技术
- [LeedCode OJ]#89 Gray Code
- Android 记录的(MediaRecorder)而播放(MediaPlayer)
- dl,dt,dd,ul,li,ol区别
- 第 15 章 应用本地化
- DevOps:怎么实现源代码注释和系统文档的自动化更新?
- poj1321--棋盘问题
- php生成静态页面
- Linux中搭建SVN服务器