1谁是幸运儿--赛码网周考(0609)

Posted qqky

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1谁是幸运儿--赛码网周考(0609)相关的知识,希望对你有一定的参考价值。

时间限制: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 }

 

以上是关于1谁是幸运儿--赛码网周考(0609)的主要内容,如果未能解决你的问题,请参考以下文章

赛码网 5.12周考

赛码网的一道百度编程题

赛码网算法:认老乡

赛码网-1

赛码网-约会

赛码网算法: 格子游戏