《挑战程序设计竞赛》开篇抽签问题

来源:互联网 发布:递归算法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