《挑战程序设计竞赛》开篇抽签问题
来源:互联网 发布:递归算法1加到100 编辑:程序博客网 时间:2024/04/28 19:53
将写有数字的n个纸片放入一个纸箱子中,然后你和你的朋友从纸箱子中抽取4张纸片,每次记下纸片上的数字后放回子箱子中,如果这4个数字的和是m,代表你赢,否则就是你的朋友赢。
请编写一个程序,当纸片上所写的数字是k1,k2,k3,k4,..,kn时,是否存在抽取4次和为m的方案,如果存在,输出YES;否则,输出NO。
限制条件:
- 1 <= n <= 50
- 1 <= m <= 10^8
- 1 <= ki <= 10^8
#define N 5#define M 10set<int> s;int myCmp(const void *a, const void *b) {return *(int*) a - *(int*) b;}void initRandom(int* arr) {srand(unsigned(time(0)));for (int i = 0; i < N; i++) {arr[i] = rand() % 10;}qsort(arr, N, sizeof(int), myCmp);}void initSumSet(int* arr) {for (int i = 0; i < N; ++i) {for (int j = 0; j < N; ++j) {s.insert(arr[i] + arr[j]);}}}int binaryFind(int* arr, int find) {if (!arr) {return -1;}int low = 0;int high = N - 1;int mid = (low + high) / 2;while (low <= high) {if (find < arr[mid]) {high = mid - 1;} else if (find > arr[mid]) {low = mid + 1;} else if (find == arr[mid]) {return mid;}mid = (low + high) / 2;}return -1;}void findFourNum2Sum(int* arr) {for (int i = 0; i < N; i++) {if (i > 0 && arr[i - 1] == arr[i]) {continue;}for (int j = 0; j < N; j++) {if (j > 0 && arr[j - 1] == arr[j]) {continue;}for (int k = 0; k < N; k++) {if (k > 0 && arr[k - 1] == arr[k]) {continue;}int id = -1;if ((id = binaryFind(arr,M - (arr[i] + arr[j] + arr[k]))) != -1) {cout << arr[i] << "+" << arr[j] << "+" << arr[k] << "+"<< arr[id] << endl;}}}}}int find2NumEqToSum(int* arr, int sum, int index1, int index2) {int flag = 0;int begin = 0;int end = N - 1;while (begin < end) {if (arr[begin] + arr[end] < sum) {begin++;} else if (arr[begin] + arr[end] > sum) {end--;} else {flag = 1;cout << arr[index1] << "+" << arr[index2] << "+" << arr[begin]<< "+" << arr[end] << endl;begin++;end--;while (arr[begin] == arr[begin - 1]) {begin++;}while (arr[end] == arr[end - 1]) {end--;}}}return flag;}void findFourNum2Sum1(int* arr) {for (int i = 0; i < N; i++) {if (i > 0 && arr[i - 1] == arr[i]) {continue;}for (int j = 0; j < N; j++) {if (j > 0 && arr[j - 1] == arr[j]) {continue;}set<int>::iterator it = s.find(M - arr[i] - arr[j]);if (it != s.end()) {find2NumEqToSum(arr, M - arr[i] - arr[j], i, j);}}}}
0 0
- 《挑战程序设计竞赛》开篇抽签问题
- 挑战程序设计竞赛:0101抽签
- ACM挑战程序设计竞赛1.1抽签
- 挑战程序设计竞赛——1.63抽签加强版
- 《挑战程序设计竞赛》 P2 题目:抽签 优化,优化,再优化
- 挑战程序设计---抽签
- 挑战程序设计:抽签
- 挑战程序设计竞赛 2.1部分和问题
- 《挑战程序设计竞赛》P30部分和问题
- 挑战程序设计竞赛: 硬币问题, 一直贪心
- 挑战程序设计竞赛 部分和问题
- 挑战程序设计竞赛 多重部分和问题
- 大背包问题(挑战程序设计竞赛)
- 《挑战程序设计竞赛》 超大背包问题实现
- 程序设计--抽签问题
- 编程挑战1:抽签问题
- 《挑战程序设计竞赛》 读后感
- 挑战程序设计竞赛:三角形
- Cookie/Session机制详解(2)Session
- Hadoop64位版本安装后遇到的警告处理
- 先验概率与后验概率是什么?
- C++ Sets & MultiSets
- 隐藏和封装
- 《挑战程序设计竞赛》开篇抽签问题
- 微信小程序之设置所有页面背景颜色
- 网页区分单击还是双击
- Java SE学习笔记:类与对象、构造器原理、static修饰符
- S2 第五章 我的租房网
- 让用VS2012/VS2013编写的程序在XP中顺利运行
- Linux常用命令
- java List转换为字符串并加入分隔符的方法
- TMS320F28027将程序下载到flash中运行