算法题挑选幸运数字
题目描述:
现在比较盛行这样的一个抽奖游戏:每个人在1到1000中选一个
数字写下来,然后拿出来比较,谁的数字既没有和其它人重复的,
并且是不重复里的最小的一个的话,那他这个就是Lucky Number。
谁手上得到这个Lucky Number,谁就会得到丰厚的奖品哦!
输入:
多组测试数据。第一行是n,下一行接着是n个人分别写下的
数字,其中1<=n<=10000,当输入的n为0的时候结束程序。
输出:
输出哪个人手上的数是Lucky Number,同时把这个数也输出。
如果没有Lucky Number,就输出"Thank you for playing"
样例输入:
5
1 3 1 7 5
7
1 2 3 1 2 4 3
0
样例输出:
2 3
6 4
提示:
对于:5
1 3 1 7 5
Lucky Number是3,在第二个位置(也就是第二个人手上),
所以输出:2 3
下一个同理,4是Lucky Number,第六个人手上,所以输出:
6 4
[解决办法]
#include <stdio.h>#include <malloc.h>int main(){ int count, *num, *mark, i, min, minSub; mark = (int*)malloc(sizeof(int)*1001); while(scanf("%d", &count), count) { for(i = 1; i < 1001; ++i) mark[i] = 0; num = (int*)malloc(sizeof(int)*count); for(i = 0; i < count; ++i) { scanf("%d", &num[i]); ++mark[num[i]]; } min = 1001; minSub = 0; for(i = 0; i < count; ++i) { if(mark[num[i]] == 1 && num[i] < min) { min = num[i]; minSub = i; } } printf("%d %d\n", minSub+1, min); free(num); } free(mark); return 0;}
[解决办法]
#include <vector> #include <algorithm> #include <functional> using namespace std;struct AssessTypeInfo{ int array; //输入的幸运数字 int number; //序号}; bool lessmark(const AssessTypeInfo& s1,const AssessTypeInfo& s2){ return s1.number < s2.number;} int main(){ vector<AssessTypeInfo > ctn; int n = 0; int temp = -1; int i = 0; bool bRet = false; scanf("%d", &n); while(n) { AssessTypeInfo a; for(i=0; i<n; i++) { scanf("%d", &a.array); a.number = i+1; ctn.push_back(a); } sort(ctn.begin(), ctn.end(), lessmark); //升序排序 i = 0; temp = ctn[i].array; for(i=1; i<n; i++) { if(temp != ctn[i].array) { if(bRet) { temp = ctn[i].array; bRet = false; continue; } break; } bRet = true; } printf("%d %d\n",ctn[i].number,ctn[i].array); } return 0;}
[解决办法]
#include <iostream>using namespace std;void getLuckyNumber(int arr[], int n, int *luckyPos, int *luckyNum){ int *temp = new int[1000]; memset(temp, 0, 1000 * sizeof(int)); for(int i = 0; i < n; ++i) { if(temp[arr[i]] == 0) temp[arr[i]] = 1; else temp[arr[i]] = 2; } *luckyNum = 1001; for(int i = 0; i < 1000; ++i) { if(temp[i] == 1) { if(i < *luckyNum) { *luckyNum = i; } } } if(*luckyNum == 0) { *luckyPos = -1; return; } for(int i = 0; i < n; ++i) { if(*luckyNum == arr[i]) { *luckyPos = i + 1; break; } }}int main(){ int arr[] = {1, 2, 3, 1, 2, 4, 3}; int pos, num; getLuckyNumber(arr, sizeof(arr) / sizeof(arr[0]), &pos, &num); cout << pos << endl; cout << num << endl; return 0;}