首页 > 其他分享 >约瑟夫环(幸存者)

约瑟夫环(幸存者)

时间:2024-01-30 20:55:06浏览次数:25  
标签:11 10 13 20 21 23 约瑟夫 幸存者

【问题描述】

有编号从 1 到 N 的 N 个人坐成一圈报数,报到 M 的人出局,下一位再从1开始,如此持续,直止剩下一位为止,报告此人的编号 X。输入 N,M,求出 X。

【输入格式】

第一行2个正整数N和M。

【输出格式】

  一个整数。

【数据规模】

50% 的测试数据中,N,M 最大为20000。

100% 的测试数据中,N,M 最大为2000000。


  1. (在纸上)尝试寻找依次出圈的人的规律,发现不行
  2. (在纸上)尝试固定n,枚举m,找出幸存者的规律,太费时间,于是想到暴力打表,发现没规律
  3. 利用上步程序,固定m,枚举n,发现有规律:
    n x(幸存者) m=3
    =============
    1: 1
    2: 2
    3: 2
    4: 1
    5: 4
    6: 1
    7: 4
    8: 7
    9: 1
    10: 4
    11: 7
    12: 10
    13: 13
    14: 2
    15: 5
    16: 8
    17: 11
    18: 14
    19: 17
    20: 20
    21: 2
    22: 5
    23: 8
    24: 11
    25: 14
    26: 17
    27: 20
    28: 23
    29: 26
    30: 29
    31: 1
    32: 4
    33: 7
    34: 10
    35: 13
    36: 16
    37: 19
    38: 22
    39: 25
    40: 28
    41: 31
    42: 34
    43: 37
    44: 40
    45: 43
    46: 46
    47: 2
    48: 5
    49: 8
    50: 11
    51: 14
    52: 17
    53: 20
    54: 23
    55: 26
    56: 29
    57: 32
    58: 35
    59: 38
    60: 41
    61: 44
    62: 47
    63: 50
    64: 53
    65: 56
    66: 59
    67: 62
    68: 65
    69: 68
    70: 1
    71: 4
    72: 7
    73: 10
    74: 13
    75: 16
    76: 19
    77: 22
    78: 25
    79: 28
    80: 31
    81: 34
    82: 37
    83: 40
    84: 43
    85: 46
    86: 49
    87: 52
    88: 55
    89: 58
    90: 61
    91: 64
    92: 67
    93: 70
    94: 73
    95: 76
    96: 79
    97: 82
    98: 85
    99: 88
    100: 91

  1. 随着n增加,大多数x都增加3(即m)
  2. 但是有的x就不是这样,比如n=20和21时,按照上步规律,n=21时,x应该是 20(上一个x) +3=23,但是此时x却是2
  3. 继续分析,发现2=23 % 21(此时的n)
  4. 上步规律适用于所有x间断处
  5. 于是得到x的迭代公式:x=(x+m)%i (i为循环变量,从1到n)
  6. 因为编号从1开始,所以应输出x+1

#include<bits/stdc++.h>
using namespace std;
int main() {
    int n, m;
    cin >> n >> m;
    int ans=0;
    for(int i=1; i<=n; i++) {
        ans=(ans+m)%i;
    }
    cout<<ans+1;
    return 0;
}

标签:11,10,13,20,21,23,约瑟夫,幸存者
From: https://www.cnblogs.com/algorithm-hu/p/17997927

相关文章

  • 3254:约瑟夫问题No.2C
    做个循环列表就行了。逻辑上想想还是很简单的。然而在实践的时候需要考虑许多边界情况。每次循环的时候要考虑头节点的问题。#include<stdio.h>#include<stdlib.h>structnode{intdata;structnode*next;};typedefstructnodeqlist;intmain(){qlist......
  • 3254:约瑟夫问题No.2C++
    \这题思路还是挺多的。如果用数学的角度考虑。知道了n,p,m自然就知道下一个要出队的人的编号。然后一个个输出就行了。还可以用循环链表做。还可以用队列。出队在入队。#include<iostream>#include<queue>usingnamespacestd;intmain(){intn,p,m;while(......
  • P1145 约瑟夫
    题目链接:考虑使用循环链表来维护该环形数据结构。但下列代码只能通过70/100#include<bits/stdc++.h>usingnamespacestd;intne[50];intmain(){ intk,n,m; boolflag=true; cin>>k; n=2*k,m=k+1; for(inti=1;i<n;i++)ne[i]=i+1;......
  • 有没有一捏 约瑟夫环
    7-5有没有一捏题目背景一个神秘的数字解码器被用来识别和分析城市监控系统中的加密信号。这些信号用二进制代码表示,二进制值代表了不同类型的安全信息,当二进制值的最后一位为0时,代表该信号是安全的,不会造成网络威胁,如果最后一位是1的,则该信号是1,有潜在的网络威胁。作为一名......
  • 约瑟夫(环形链表)
    约瑟夫(环形链表)/***@author缪广亮*@version1.0*/classJoseph{publicstaticvoidmain(String[]args){CircleSingleLinkedListcircleSingleLinkedList=newCircleSingleLinkedList();circleSingleLinkedList.addBoy(5);circ......
  • 算法:约瑟夫环问题
    问题描述:n个人围成一圈,从编号为k的人开始报数,报到m的人出圈,剩下的人继续从1开始报数,报到m的人出圈;如此往复,求最后一个出圈的人 /**@paramarrarray值为range(1,总人数)*@parammint报号到m的人出圈*@paramcurrentint从第current+1个人开始喊1;值为k-1*@return......
  • 算法题:约瑟夫环问题
    原题:N个人围成一圈顺序编号,从1号开始按1、2、3…顺序报数,报p者退出圈外,其余的人再从1、2、3开始报数,报p的人再退出圈外,以此类推。请按退出顺序输出每个退出人的原序号。输入格式:输入只有一行,包括一个整数N(1<=N<=3000)及一个整数p(1<=p<=5000)。输出格式:按退出顺序输出每个......
  • 大二算法实验一用循环链表解决约瑟夫环
    题目约瑟夫(Joeph)问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的......
  • 约瑟夫环问题
    我今天要讲的问题是约瑟夫环问题。本蒟蒻第一篇学术文章,多多支持,写的不好请见谅。洛谷题库约瑟夫环问题这题是一道好题目,我这里推荐两种解法1.直接模拟我用了一个数组来模拟,在圈内为无穷大,不在圈内则为0。模拟时要注意以下几点:如果当前已经出了圈,那么这个位置不算一人。......
  • 【十分钟一个知识点】约瑟夫环问题
    问题来历据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,......