时间限制:C/C++语言 2000MS;其他语言 4000MS
内存限制:C/C++语言 65536KB;其他语言 589824KB
题目描述:
小A是某公司的员工,在一次公司年会上,主持人宣布进行一项游戏来活跃年会气氛,游戏规则如下:n个人随机站成一排,按照他们所站的顺序依次给他们编号从1到n,接下来就从编号为1的人开始,按从左到右的顺序每隔一人选出一个人,选出的这些被淘汰,剩下的需要重新站成一排,其中首尾是接龙的,即如果倒数第二个被淘汰,则隔一人即第一个人被淘汰,如此循环一直到最后剩下两个人为止,那么这剩下的最后两个人就是本场晚会的幸运儿,得到神秘大奖,小A想成为这个幸运儿,请你帮小A算出来开始时他应该站在什么位置才最终可以成为幸运儿。(3<=n<=50)
输入
开始的进行游戏的总人数n
输出
第一行是选出顺序,第二行是两名幸运儿的初始位置(按升序排列),要求位置编号之间用一个空格空开。
样例输入
5
样例输出
2 4 1
5 3
解题思路一:定义链表来存储,然后让链表的尾指针的下一个指向头,构成环形链表
再从头开始遍历,每次输出p->next,为删除的内容;p->next = p->next->next,剩两个结点时,p->next->next = p本身,因此可知循环截止条件。输出剩余的两个结点即可
1 #include <iostream> 2 #include <malloc.h> 3 using namespace std; 4 typedef struct list{ 5 struct list *next; 6 int elem; 7 } list ; 8 9 int main() 10 { 11 int n; 12 int i; 13 list *head; 14 list *p; 15 while(cin>>n) 16 { 17 p = (list*)malloc(sizeof(list)); 18 p ->elem = 1; 19 head = p; 20 for(i = 2;i<=n;i++) 21 { 22 p->next = (list*)malloc(sizeof(list)); 23 p->next ->elem = i; 24 p = p->next; 25 } 26 p->next = head; 27 p = head; 28 29 while(p ->next->next != p) 30 { 31 cout<<p->next->elem<<" "; 32 p->next = p->next->next; 33 p = p->next; 34 } 35 cout<<endl; 36 cout<<p->next->elem<<" "<<p->elem<<endl; 37 break; 38 } 39 return 0; 40 }
解题思路二:使用set存储,当set中元素的个数大于2个,执行循环,在循环中,需要每隔一个元素删除一个,本次要回到头开始有两种情况:1、正好遍历到最后一个,此时指向头,再++,2、遍历到最后一个的前一个,下一个从头开始。删除当前访问的结点
1 #include <iostream> 2 #include <vector> 3 #include <string> 4 #include <algorithm> 5 #include <set> 6 7 int main() 8 { 9 using namespace std; 10 int n; 11 while (cin >> n) { 12 set<int> arr; 13 for (int i = 0; i < n; i++) { 14 arr.insert(i + 1); 15 } 16 set<int>::iterator iter = arr.begin(); 17 iter++; 18 set<int>::iterator itor = iter; 19 while (arr.size() > 2) { 20 itor++; 21 if (itor == arr.end()) { 22 itor = arr.begin(); 23 itor++; 24 } 25 else if (++itor == arr.end()) { 26 itor = arr.begin(); 27 } 28 if(arr.size() > 3) 29 cout << *iter << " "; 30 else 31 cout << *iter << endl; 32 arr.erase(*iter); 33 iter = itor; 34 } 35 if (iter == arr.begin()) { 36 cout << *arr.begin() << " " << *arr.rbegin() << endl; 37 } 38 else { 39 cout << *arr.rbegin() << " " << *arr.begin() << endl; 40 } 41 } 42 return 0; 43 }
时间: 2024-10-24 22:24:04