不敢死队问题--约瑟夫变形

不敢死队问题

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

说到“敢死队”,大家不要以为我来介绍电影了,因为数据结构里真有这么道程序设计题目,原题如下:

有M个敢死队员要炸掉敌人的一个碉堡,谁都不想去,排长决定用轮回数数的办法来决定哪个战士去执行任务。如果前一个战士没完成任务,则要再派一个战士上去。现给每个战士编一个号,大家围坐成一圈,随便从某一个战士开始计数,当数到5时,对应的战士就去执行任务,且此战士不再参加下一轮计数。如果此战士没完成任务,再从下一个战士开始数数,被数到第5时,此战士接着去执行任务。以此类推,直到任务完成为止。

这题本来就叫“敢死队”。“谁都不想去”,就这一句我觉得这个问题也只能叫“不敢死队问题”。今天大家就要完成这道不敢死队问题。我们假设排长是1号,按照上面介绍,从一号开始数,数到5的那名战士去执行任务,那么排长是第几个去执行任务的?

输入

输入包括多试数据,每行一个整数M(0<=M<=10000)(敢死队人数),若M==0,输入结束,不做处理。

输出

输出一个整数n,代表排长是第n个去执行任务。

示例输入

9
6
223
0

示例输出

2
6
132
约瑟夫问题的应用

不敢死队问题--约瑟夫变形

时间: 2024-11-07 06:28:19

不敢死队问题--约瑟夫变形的相关文章

uva 1452(约瑟夫变形)

题意:有1到n顺时针坐在圆桌上,编号从1到n,从1开始顺时针报数,每k个出去一个人,输出倒数第三个出去.倒数第二个出去.倒数第一个出去的人的编号. 题解:n的范围是500000,肯定不能用链表来解,这就用到了约瑟夫问题的递推式:f[i] = (f[i - 1] + k) % i,初始f[1] = 0表示还剩1个人的时候最后出去的人编号一定是0(这里默认编号从0开始),那么根据递推式可以得到f[n]就是还剩n个人最后出去的人,倒数第二个人也可以通过这个式子推导出来:(k + 1) % 2是还剩两个

【UVa】Jump(dp)

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4198 约瑟夫变形 根据f(n)=(f(n-1)+m)%n 因为是求倒数第几个 那么我们只要求出f(倒数第几个)的值然后再带进去即可. (没理解的自行面壁..) 而f(倒数第几个)=(m-1)%倒数第几个 然后就行了.. #include <cstdio> #include <

And Then There Was One(约瑟夫问题变形)

题目链接:http://poj.org/problem?id=3517 And Then There Was One Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5014   Accepted: 2685 Description Let’s play a stone removing game. Initially, n stones are arranged on a circle and numbered 1, …

uvalive 4727 jump跳跃(dp/约瑟夫问题变形)

 题意是: 个数组成一个环,从第k个元素开始删除,每隔k个元素删一个,问最后删除的三个是什么 思路:约瑟夫问题变形,倒数第二个第三个求法与最后一个元素求法相同 #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<iostream> #include<algorithm> #include<vector> #inclu

【约瑟夫环变形】UVa 1394 - And Then There Was One

首先看到这题脑子里立刻跳出链表..后来继续看如家的分析说,链表法时间复杂度为O(n*k),肯定会TLE,自己才意识到果然自个儿又头脑简单了 T^T. 看如家的分析没怎么看懂,后来发现这篇自己理解起来更容易(...)共享一下~http://blog.csdn.net/chenguolinblog/article/details/8873444 问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数.求胜利者的编号. 编号0~(n-1)是有意义的,因为要

Poj 3517 And Then There Was One(约瑟夫环变形)

简单说一下约瑟夫环:约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周围的人全部出列. 想要求出最后剩下的那个人的在初始的时候的编号的话. f[1]=0; f[i]=(f[i-1]+m)%i;  (i>1) 可以推出剩下i个人内叫到m的时候的编号.注意这是逆推.推到最后初始的时候的情况 #include<stdio.h>

HDU 5643 King&#39;s Game | 约瑟夫环变形

经典约瑟夫环 1 int f[N] ={ 0 }; 2 for(int i=2; i<=n; i++) 3 { 4 f[i] = (f[i-1] + k) % i; 5 } 变形:k是变化的 #include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <stdlib.h> #include <queue> #in

约瑟夫环的变形

问题描述: 输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知),和初始计数值m.从数列首位置开始计数,计数到m后,将数列该位置数值替换计数值m,并将数列该位置数值出列,然后从下一位置从新开始计数,直到数列所有数值出列为止.如果计数到达数列尾段,则返回数列首位置继续计数.请编程实现上述计数过程,同时输出数值出列的顺序. 比如:输入的随机数列为:3,1,2,4,初始计数值m=7,从数列首位置开始计数(数值3所在位置) 第一轮计数出列数字为2,计数值更新m=2,出列后数列为3,1,4

约瑟夫问题及其变形

部分转自http://blog.csdn.net/kangroger/article/details/39254619,复习自用 本渣昨天晚上做了一道模拟赛,第一道题是一个递推的小题,上网一查原来这个题是有一个经典模型的 约瑟夫环问题:一圈共有N个人,开始报数,报到M的人自杀,然后重新开始报数,问最后自杀的人是谁? 如图:内环表示人排列的环,外环表示自杀顺序:上面N=41,M=3. 最普通办法就是模拟整个过程:建一个bool数组,true表示此人还活着,false表示已经自杀.可以模拟整个过程