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 }
时间: 2024-10-24 22:24:04

1、谁是幸运儿--赛码网周考(0609)的相关文章

2、机场指示灯--赛码网周考(0609)

时间限制:C/C++语言 1000MS:其他语言 3000MS 内存限制:C/C++语言 65536KB:其他语言 589824KB 题目描述: 机械工小王在一次乘坐飞机时对机场的跑道指示灯比较感兴趣,他想设计一种模拟电路控制机场指示灯的亮灭以便在紧急情况中可以用指示灯的排列来向机场人员传达某种信号. 小王在模拟电路中设计了 n 个指示灯,每个指示灯操作一次就会将其状态改变,即:点亮转为关闭,或关闭转为点亮.将这些指示灯从 1 到 n 编号,开始的时候所有指示灯都是关闭的.小王计划在模拟电路中上

赛码网 5.12周考

本来都不想写下去了,后来想想,还是写写吧!以后回过头来看看,就可以说,哦,那些时间去做这个了! 下面步入正题. 赛码网 5.12周考 题目挺难的,反正我2道题目都没有做出来,官网上也没有贴出来答案,就只好自己去找了. 1. 暴力搜索肯定是不行的,时间复杂度很高,只好找一种数个数的方法,没有想到. 题解链接:http://krydom.com/bzoj1801/ 解释的应该很详细,但是我有一点疑问, 放2个到一个空列上 与 放一个到只有一个的列上,另一个放到空列上, 这两种的转移方式 应该是不同的

赛码网的一道百度编程题

最近偶尔接触到这个赛码网,看了百度的一道编程题,于是尝试了一下,发现虽然天天写代码实现这个居然花了我好长时间,仍然没有通过全部案例.目前给的通过率是83% 题目如下: 小B最近对电子表格产生了浓厚的兴趣,她觉得电子表格很神奇,功能远比她想象的强大.她正在研究的是单元格的坐标编号,她发现表格单元一般是按列编号的,第1列编号为A,第2列为B,以此类推,第26列为Z.之后是两位字符编号的,第27列编号为AA,第28列为AB,第52列编号为AZ.之后则是三位.四位.五位--字母编号的,规则类似. 表格单

赛码网算法: 上台阶 ( python3实现 、c实现)

上台阶 题目描述 有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第m级,共有多少走法?注:规定从一级到一级有0种走法. 输入输入数据首先包含一个整数n(1<=n<=100),表示测试实例的个数,然后是n行数据,每行包含一个整数m,(1<=m<=40), 表示楼梯的级数.样例输入223输出对于每个测试实例,请输出不同走法的数量.样例输出12时间限制C/C++语言:2000MS其它语言:4000MS 内存限制C/C++语言:65537KB其它语言:589825KB

赛码网算法:认老乡

最近在赛码网上做算法题,看到这样一道题,经过不断的学习,最后解决了.把我的思想和代码给大家分享一下~ 认老乡 题目描述大学的同学来自全国各地,对于远离家乡步入陌生大学校园的大一新生来说,碰到老乡是多么激动的一件事,于是大家都热衷于问身边的同学是否与自己同乡,来自新疆的小赛尤其热衷.但是大家都不告诉小赛他们来自哪里,只是说与谁同乡,从所给的信息中,你能告诉小赛有多少人确定是她的同乡吗? 输入每个测试实例首先包括2个整数,N(1 <= N <= 1000),M(0 <= M <= N*

赛码网算法: 格子游戏

格子游戏 题目描述 有n个格子,从左到右放成一排,编号为1-n.共有m次操作,有3种操作类型:1.修改一个格子的权值,2.求连续一段格子权值和,3.求连续一段格子的最大值.对于每个2.3操作输出你所求出的结果. 输入输入第一行两个整数,n表示格子个数,m表示操作次数,n和m中间用空格隔开:接下来输入n行,每行一个整数表示一个格子的权值接下来输入m行,每行有三个整数,中间用空格隔开:第一个是选择的操作类型1-3,第二和第三个整数是操作格子的编号.样例输入3 37892 1 33 1 32 1 2输

赛码网-1

公交车乘客 题目描述 一个公交车经过n个站点,乘客从前门上车,从后门下车. 现在统计了在第i个站,下车人数a[i],以及上车人数b[i]. 问公交车运行时候车上最多有多少乘客 输入 第一行读入一个整数n(1<=n<=100),表示有n个站点 接下来n行,每行两个数值,分别表示在第i个站点下车人数和上车人数 样例输入 4 0 3 2 5 4 2 4 0 输出 每组输出车上最多的乘客数目 样例输出 6 时间限制 C/C++语言:1000MS其它语言:3000MS 内存限制 C/C++语言:6553

【JavaScript】赛码网前端笔试本地环境搭建

参考:https://hoofoo.me/article/2017-04-11/%E8%B5%9B%E7%A0%81%E7%BD%91%E5%89%8D%E7%AB%AF%E7%AC%94%E8%AF%95%E6%9C%AC%E5%9C%B0%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA.html print方法的实现 这个没有什么难度,只是把console.log改个名字的事情,一行代码就可以解决. var print = console.log read_line方

赛码网-研究生考试

研究生考试 题目描述 欢迎大家参加奇虎360 2016校招在线招聘考试,首先预祝大家都有个好成绩! 我相信参加本次在线招聘考试的有不少研究生同学.我们知道,就计算机相关专业来说,考研有4门科目,分别是政治(满分100分),英语(满分100分),数学(满分150分)和专业课(满分150分). 某校计算机专业今年录取研究生的要求是:政治.英语每门课成绩不低于60分,数学和专业课不低于90分,总成绩不低于310分.并且规定:在满足单科以及总成绩最低要求的基础上,350分以上(含350分)为公费(Gon