WUSTOJ 1234: 约瑟夫问题-输出最后的编号

参考资料

约瑟夫问题——百度百科

Description

n个人围成一圈,依次从1至n编号。从编号为1的人开始1至k报数,凡报数为k的人退出圈子,输出最后留下的一个人原来的编号。

Input

首先输入一个t,表示有t组数据(1<= t <= 10010),然后有t行,每行有2个正整数n和k。(1<= n,k<= 20)

Output

对于每组测试数据,输出一个数,表示最后留下来的人的编号。

Sample Input

3
10 3
7 1
5 4

Sample Output

4
7
1

题目分析

这道题目,有几种做法, 我都尝试了一下,结果提交时间太不稳定了,其他的做法代码就没贴上来。下面代码用的是百度百科里的算法(我认为应该是最好的,然而提交时间最长,可能数据太短了吧)。

  1. 最基础的算法应该是,用数组表示所有人,1表示还在,0表示退出。然后不断用循环搜索,模拟人报数的过程,这应该是最容易想到的了;

  2. “虚拟环”算法,暂且就这么叫吧。同样是数组,但是初始化的时候并不是赋值为1,而是下一个人的下标。例如: 有5个人,报数为3的退出。注:下标从1开始,下标为0不考虑

    初始数组为circle[6] = { 0, 2, 3, 4, 5, 1 },当数到3的时候,第3个人退出,因此数组变成circle[6] = { 0, 2, 4, 4, 5, 1 }。OK,这里就不细讲了。

  3. “递推公式”算法,待补充

代码

/**
* AC用时:1263ms
* @author wowpH
* @version 4.0
* @date 2019年4月11日 下午11:57:37
*/
import java.util.Scanner; public class Main { private Scanner sc;
private int t, n, k;
private int f, i; public Main() {
sc = new Scanner(System.in);
t = sc.nextInt();
while(t > 0) {
n = sc.nextInt();
k = sc.nextInt();
f = 0;
for(i = 1; i <= n; i++) {
f = (f + k) % i;
}
System.out.println(f + 1);
t--;
}
sc.close();
} public static void main(String[] args) {
new Main();
} }

小结

对于一些经典算法,要考虑用多种思路解答,不能局限于某一种方法,这道题目就是很好的例子。对这类问题可适当做一些扩展,这样更有利于对算法的记忆。


1234: 约瑟夫问题-输出最后的编号(Java)的更多相关文章

  1. Java中中英文对齐输出问题,以及Java中的格式化输出

    一 中英文对齐输出问题 问题,要求控制台输出如下: abcefg  def 森林 阿狗 其实就是要求对齐输出,各种查找java的格式化输出,然后发现只要一个简单的“\t”就可以实现. 代码如下: Sy ...

  2. 约瑟夫环简介,问题以及java实现

    问题:一群猴子排成一圈,按1,2,--.,n依次编号.然后从第一只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,再把它踢出去-------.,如此不停的进行下去,直到最后只剩下一只猴 ...

  3. 文件的输出与载入之java操作

    一.前言 学习java没多久,关键是没怎么系统学过.都是看别人的代码来学习的.今天就把一直以来让我头痛的java  IO 的一些基本操作来记录下来,加深记忆. 二.java导入文件到内存中 首先放一个 ...

  4. zoj 2588 Burning Bridges【双连通分量求桥输出桥的编号】

    Burning Bridges Time Limit: 5 Seconds      Memory Limit: 32768 KB Ferry Kingdom is a nice little cou ...

  5. 最长DNA重复序列长度,并输出该序列。 JAVA

    1:  最长DNA重复序列长度,并输出该序列. 例如  ATCGTAGATCG,它的最大长度为4,序列为 ATCG. package com.li.huawei; import java.util.S ...

  6. L1-023 输出GPLT (20 分) java题解 GPLT天梯赛防坑技巧

    上题目先 给定一个长度不超过10000的.仅由英文字母构成的字符串.请将字符重新调整顺序,按GPLTGPLT....这样的顺序输出,并忽略其它字符.当然,四种字符(不区分大小写)的个数不一定是一样多的 ...

  7. for循环输出素数探究【java】

    一.判断953是不是为素数(质数). 代码: /** 判断953是不是为素数(质数) 分析: 素数指整数在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数. 假设953是素数,则: ...

  8. java读取文件内容并输出到控制台,java中实现文件复制

    public class TestFileInputStream { public static void main(String [] args) { //读取指定文件中内容,并在控制台输出 Fil ...

  9. Java学习之约瑟夫环的两中处理方法

    package day_2; import java.util.Scanner; /** * @author Administrator * 约瑟夫环问题: 设编号为 1,2,3,....n的N个人围 ...

随机推荐

  1. PullToRefresh原理解析,pulltorefresh解析

    PullToRefresh原理解析,pulltorefresh解析 代码届有一句非常经典的话:"不要重复制造轮子",多少人看过之后便以此为本,把鲁迅的"拿来主义" ...

  2. [mysql] Mysql数据分组GROUP BY 和HAVING,与WHERE组合使用

    理解分组,可以这样:对GROUP BY子句后面跟随的列名进行分组,然后对每一个分组而不是整个表进行操作. 举例:在产品表中,检索每一个供应商提供的商品的数量. mysql> SELECT ven ...

  3. 小程序checkbox调整大小

    .cb{ transform: scale(0.6,0.6); } <view> <label class="lab" for="box1"& ...

  4. javaScript(拼写树形)+ajax请求,去后台查找数据

    第一步:页面加载完成时,利用jquery中的一函数,调用js方法,js方法,发送ajax请求,去后台查找父类权限集合,响应回来json格式的数据,对数据进行操作,往页面上添加内容 //页面初始化加载菜 ...

  5. osg::PagedLOD example

    int main() { osg::ref_ptr<osgViewer::Viewer> viewer1 = new osgViewer::Viewer; osg::ref_ptr< ...

  6. ES6 Syntax and Feature Overview

    View on GitHub Note: A commonly accepted practice is to use const except in cases of loops and reass ...

  7. web自动化01-自动化解决的问题-环境搭建-元素定位

    自动化测试 概念:由程序代码代替人工完成验证系统功能的过程 解决的问题: 回归测试 压力测试 兼容性测试 提高测试效率,提升产品质量 自动化测试分类 web自动化测试 移动自动化测试 接口自动化测试 ...

  8. vue-cli 引入stylus报错

    在App.vue页面添加以下代码报错: <style lang="stylus" rel="stylesheet/stylus"> </sty ...

  9. activiti的坑

    maven配置: <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-e ...

  10. Jquery Ajax WebService

    仅供参考 ws.aspx 代码 <script type="text/javascript"> $(function () { $.ajax({ type: " ...