Wannafly挑战赛15 C“出队”(约瑟夫环类问题)
•参考资料
[1]:浅梦无痕
[2]:Esquecer
[3]:My CSDN
•题意
n 个人围成一圈,1,2 报数,报 1 的离队,求编号为 x 的第几次出队;
•对博文[1]的理解
第一轮出队的编号一定为奇数,如果 x 为奇数,那么 x 一定在第一轮就出队了,ans = (x+1) / 2;
如果 x 不为奇数,那么,执行的过程如下:
while(x% == )
{
x /= ;
if(n&)
x++;
ans += n/;
n -= n/;
}下面来解释一下上述代码的作用;
①如果 x 为偶数,那么在第一轮出队中,x 及其之前的偶数不出队,共 x/2 个编号;
②如果 n 为偶数,那么第一轮出队中共出队 n/2 个编号,还剩下 n/2 个编号,x 为剩下的编号中的第 x/2 个编号;
在第二轮出队中,剩下的第一个编号依旧是第一个出队的编号,相当于剩下的 n/2 个编号重复一遍上述①②过程;
如果 n 为奇数,那么第一轮出队中共出队 n/2+1 个编号,还剩下 n/2 个编号;
但是,这剩下的 n/2 个编号在第二轮出队中,第一个出队的编号不再是第一个编号,而是第二个编号,与上述②过程不同;
这该如何处理呢?
很好办,在第一轮的出队中,让最后一个出队的编号 n 放到第二轮出队的队首位置,那么第二轮出队的编号中,第一个出对的依旧是第一个编号;
其余编号的变化是在之前的基础上+1,接着重复上述①②过程;
•Code
#include<bits/stdc++.h>
using namespace std;
#define ll long long ll n,x;
int q; ll Solve()
{
ll ans=;
ll cur=n;
while(x% == )
{
x /= ;///x及其之前共有x/2个编号
if(cur&)///如果当前剩余奇数个编号,将最后一个编号放到下一轮出队
x++;
ans += cur/;
cur -= cur/;
}
ans += (x+)/;
return ans;
}
int main()
{
scanf("%lld%d",&n,&q);
while(q--)
{
scanf("%lld",&x);
printf("%lld\n",Solve());
}
return ;
}
•对博文[2]的理解
短小精悍的代码,tql!
如果 x 不为奇数,那么 x 肯定不再这一轮中出队,而 x 之前的偶数也不再这一轮中出队;
即有 x/2 个编号不在这一轮中出队,那么相当于在这 n 个编号的队尾增加 x/2 个编号, x 变成队尾编号;
接着执行上述过程;
•Code
#include<bits/stdc++.h>
using namespace std;
#define ll long long ll n,x;
int q; ll Solve()
{
while(x% == )
x=n+x/;///将x/2个编号加入队尾,x变为队尾编号,并判断x是否可以在第一轮中出队
return x/+;
}
int main()
{
scanf("%lld%d",&n,&q);
while(q--)
{
scanf("%lld",&x);
printf("%lld\n",Solve());
}
return ;
}
Wannafly挑战赛15 C“出队”(约瑟夫环类问题)的更多相关文章
- 牛客网Wannafly挑战赛15 B车辆安排(模拟)AND C 出队(规律)
传送门 :B题:点我 C题: 点我 题目描述 有n个队伍,每个队伍的人数小于等于5,每辆车最多坐5个人,要求一个队伍的人都在一辆车上,求最少的车数 输入描述: 第一行n第二行n个数,表示每个队伍的人数 ...
- 3,java数据结构和算法:约瑟夫环出队顺序, 单向环形链表的应用
什么是约瑟夫环? 就是数小孩游戏: 直接上代码: 要实现这个,只需要理清思路就好了 孩子节点: class Boy{ int no;//当前孩子的编码 Boy next; // 下一节点 public ...
- Wannafly挑战赛15-C-出队
链接:https://www.nowcoder.com/acm/contest/112/C来源:牛客网 约瑟夫问题(https://baike.baidu.com/item/约瑟夫问题),n个人,1 ...
- 通过例子进阶学习C++(六)你真的能写出约瑟夫环么
本文是通过例子学习C++的第六篇,通过这个例子可以快速入门c++相关的语法. 1.问题描述 n 个人围坐在一个圆桌周围,现在从第 s 个人开始报数,数到第 m 个人,让他出局:然后从出局的下一个人重新 ...
- Java数据结构之单向环形链表(解决Josephu约瑟夫环问题)
1.Josephu(约瑟夫.约瑟夫环)问题: 设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m ...
- 约瑟夫环问题详解 (c++)
问题描述: 已知n个人(以编号0,2,3...n-1分别表示)围坐在一起.从编号为0的人开始报数,数到k的那个人出列:他的下一个人又从1开始报数,数到k的那个人又出列:依此规律重复下去,直到圆桌周围的 ...
- tc 147 2 PeopleCircle(再见约瑟夫环)
SRM 147 2 600PeopleCircle Problem Statement There are numMales males and numFemales females arranged ...
- 约瑟夫环(Josehpuse)的模拟
约瑟夫环问题: 0,1,...,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字,求出这个圆圈里剩下的最后一个数字. 这里给出以下几种解法, 1.用队列模拟 每次将前m-1个元 ...
- 14.约瑟夫环问题[JosephusProblem]
[题目] n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字).当一个数字删除后,从被删除数字的下一个继续删除 ...
随机推荐
- 第三方数据库管理工具Navicat使用教程
一.Navicat Premium是一个功能强大的第三方数据库管理工具,可以连接管理MySQL.Oracle.PostgreSQL.SQLite 及 SQL Server数据库. 使用Navicat软 ...
- PHPCMS快速建站系列之标签循环嵌套
标签循环嵌套方法,可以实现对PC标签循环调用,代码如下: 在此文件里/phpcms/lib/classes/template_cache.class.php 里的 template_parse 方法里 ...
- 容器云平台使用体验:数人云Crane(续)
数人云在9月6日开通了容器管理面板Crane的试用活动,这是国内首个基于DockerSwarmKit的容器管理工具.它具有Docker原生编排功能,采用轻量化架构,帮助开发者快速搭建DevOps环境, ...
- idea列编辑模式
当我们想要选中一列时,在eclipse中alt+shit+a就可以选中一列了, 在网上很多的idea中列编辑的使用,但是对我的电脑却不管用,也不太清楚在哪里设置 最后无奈乱试一通,结果找到了 alt+ ...
- 创建ros消息时出现:Unable to load msg [planning/Num]: Cannot locate message [Num]: unknown pack.....
创建ros消息可参考创建ROS消息和ROS服务. 按照这个教程进行创建的过程中出现了如下错误: Unable to load msg [msgs/locate]: Cannot locate mess ...
- Firefox浏览器怎么安装adobe flash player插件
https://jingyan.baidu.com/article/0a52e3f435d171bf62ed7237.html 有些朋友在使用Firefox火狐浏览器,但是火狐浏览器安装以后是没有fl ...
- js+canvas五子棋人机大战ai算法
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- oracle函数 months_between(d1,d2)
[功能]:返回日期d1到日期d2之间的月数. [参数]:d1,d2 日期型 [返回]:数字 如果d1>d2,则返回正数 如果d1<d2,则返回负数 [示例] select sysdate, ...
- MySQL_连表查询
连表查询 连表查询通常分为内连接和外连接.内连接就是使用INNER JOIN进行连表查询:而外连接又分为三种连接方式,分别是左连接(LEFT JOIN).右连接(RIGHT JOIN).全连接(FUL ...
- day5_python之协程函数
一.yield 1:把函数的执行结果封装好__iter__和__next__,即得到一个迭代器2:与return功能类似,都可以返回值,但不同的是,return只能返回一次值,而yield可以返回多次 ...
