zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Linux下状态查看相关命令
    Linux免密登录理解
    Linux下远程访问&拷贝&下载
    初识NAT、桥接和Host-Only
    Linux文件和文件夹权限管理
    Linux用户和用户组的操作
    Mac+Parallels+iTerm安装配置Linux Centos7
    SSM整合事务失效
    Linux用户和用户组管理命令
    Linux中{ }的用法
  • 原文地址:https://www.cnblogs.com/qqky/p/6978088.html
Copyright © 2011-2022 走看看