http://poj.org/problem?id=1012

有k个好人和k个坏人,前k个是好人后k个是坏人。模拟约瑟夫环,每次数到m的数要被杀死,然后他后面的人从1开始报数。重复这个过程。要求输出最小的m,使得前k个被杀死的人都是坏人。


因为k比较小,我们可以枚举m,枚举到某个m满足前k个出圈人的序号都大于等于k,那么m就是所求。

以k=3为例,6个人的编号为0 1 2 3 4 5 ,好人的序号为0~k-1,坏人的序号是 k~2*k-1。

首先推出每次出圈的人在当前序列中的序号,用ans[i]表示第i个出圈的人的序号。

若m = 5,

那么ans[1] = 4,ans[2] = 3,根据这两个数我们可以推出ans[i] = (ans[i-1] + m-1)%(n-i+1),其中ans[0] = 0。注意这里的ans[i]是在前一轮杀死一个人后重新编号。


#include <stdio.h>
#include <iostream>
#include <map>
#include <set>
#include <list>
#include <stack>
#include <vector>
#include <math.h>
#include <string.h>
#include <queue>
#include <string>
#include <stdlib.h>
#include <algorithm>
#define LL long long
#define _LL __int64
#define eps 1e-12
#define PI acos(-1.0)
#define C 240
#define S 20
using namespace std;int f[30];
int ans[30];int main()
{int k;memset(ans,-1,sizeof(ans));while(~scanf("%d",&k)){if(k == 0) break;if(ans[k] != -1) //如果已经计算过,保存下来不再重复计算{printf("%d\n",ans[k]);continue;}int n = k*2; //总人数int m = 1; //从1枚举f[0] = 0;for(int i = 1; i <= k; i++) //在m下求出前k个出圈的人的编号{f[i] = (f[i-1]+m-1)%(n-i+1);if(f[i] < k) //好人被杀死,m不符,好人的编号一直是0~k-1{i = 0;m++;}}ans[k] = m;printf("%d\n",ans[k]);}return 0;
}

 

poj 1012 Joseph(约瑟夫环求每次出圈人的序号)相关推荐

  1. LabView 求出圈人的序号顺序

    对N个人按1到N进行编号,然后按顺序逆时针围成一圈.给定一个数m,从1号开始按逆时针方向数,每数到m,对应的人就从圈中出来,然后继续从下一个人开始数,直到圈中只剩下一个人,试输出出圈人的编号顺序. 程 ...

  2. C++[算法]用数组模拟约瑟夫问题,即 N个人围成一圈,顺时针每数到给定K值的人出列,直到剩下最后一个人,求出圈人的序号顺序

    约瑟夫是公元1世纪一位著名的历史学家. 约瑟夫问题可简述为: 有n人围坐成一圈(假设他们的编号沿顺时针方向依次为1到n).编程序,使用数组来存放各数据(人员编号),而后从1号人员开始数起(沿顺时针方向 ...

  3. 约瑟夫环问题,n个人围成一圈,依次按1、2.....m来报数,报数值为m的人出圈,求最后出圈的人和出圈的序列

    约瑟夫环问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题.在计算机编程的算法中,类似问题又称为约瑟夫环.又称"丢手绢问题".),也就是如下图这个样子: 简单来讲就 ...

  4. POJ 1012 Joseph 题解

    POJ 1012 Joseph 题解 题目解读: The Joseph's problem is notoriously known. For those who are not familiar w ...

  5. n个人围成一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数, 数到m的人再出圈,……依次类推, 直到所有的人都出圈,请输出依次出圈人的编号.

    88,n个人围成一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数, 数到m的人再出圈,--依次类推, 直到所有的人都出圈,请输出依次出圈人的编号. 输入 n m 输出 出圈的编号 ...

  6. 题目98-4:n个人(n<=100)围成一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数,数到m的人再出圈,……,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。

    题目转载:http://python.wzms.com/s/1/103 题目描述: n个人(n<=100)围成一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数,数到m的人再 ...

  7. 约瑟夫环问题有10(100人或者n个)个人围成一圈,从第一个人开始报数(报1、2、3),只要报3的人就出去, 然后不停的循环报数,直到最后剩下一个人,计算出这个人最开始的位置。

    有10(100人或者n个)个人围成一圈,从第一个人开始报数(报1.2.3),只要报3的人就出去, 然后不停的循环报数,直到最后剩下一个人,计算出这个人最开始的位置.其实就是约瑟夫环问题 新手小白,多多 ...

  8. hdu1443 Joseph(约瑟夫环)

    问题:有2k个人,前k个是好人,后k个是坏人,要求最小的m,使得k个坏人在好人之前. 思路: 约瑟夫环递归式为F(n,k)=(F(n-1,k) + k) mod n.其中F(n,k)表示n个人,每一次 ...

  9. And Then There Was One POJ - 3517(变形约瑟夫环+规律)

    题意: 约瑟夫问题的变式.先指定第m个人必须死,然后每隔k个人死一个.求最后那个死的人的编号是什么. 题目 Let's play a stone removing game. Initially, n ...

最新文章

  1. 职场:5种幼稚表现,好多工作十年的人还在犯
  2. java redis设置过期时间_Redis的一些核心原理
  3. 首尔日记——5月25日,出发
  4. 【BZOJ-2427】软件安装 Tarjan + 树形01背包
  5. RecyclerView+CardView
  6. linux rename命令使用示例
  7. Python程序开发——Python实现可增删改查的员工管理系统
  8. 在sql中将表建在别的构件中用什么语句_SQL实战
  9. 用java统计任一书名次数_Java入门第三季 借书系统源代码 加入了限制重输次数 欢迎指教交流...
  10. 排队8小时,火遍上海!美国最会装X的网红咖啡,又把中国人拿捏了
  11. Google IO 2018 来啦!
  12. R语言不止可以做数据分析,还可以变着方法玩出花
  13. 14Penrose广义逆(II)
  14. Ioc--控制反转详解
  15. 职业规划范文500字计算机专业,技校计算机专业职业生涯规划500字左右
  16. 微信小程序 组件传值(一) properties 父传子
  17. SOME/IP与DDS对比及DDS测试策略和方案探讨
  18. 从前慢-深入理解JVM-篇章1
  19. 基于 O2O 视角的共享经济商业模式分析 ——以 ofo 共享单车为例
  20. Unity shader 实现圆角矩形

热门文章

  1. 基于javaweb的小区物业管理系统(java+springboot+ssm+mysql)
  2. 用户故事在软件管理中的应用
  3. 收集K8S容器的标准输出日志实践
  4. 解混沌半导体激光器matlab速率方程,半导体激光器速率方程.doc
  5. 一台小型发电机与计算机相连,2020春青岛市高考物理二轮45分钟练习:交变电流的产生及描述含答案...
  6. Ubuntu 即时通讯器: QQ 下载和安装
  7. 计算机高二期末考试试题,高二信息技术期末考试试卷答案
  8. vc2010c语言使用教程,【精选】Lesson 01 C语言基础及VC2010使用指导(02.24).pdf
  9. 对接科技侠智能锁(Ble)总结
  10. 开发Android电子书App的平台