首页 > 其他分享 >(Josephus 问题) 有n个人围成一圈,依次标号0至n-1。从第0号开始,以此0,1,0,1……的顺序报数,报到1的人会离开,直至圈中只余下一个人。求最后留下的人的编号。

(Josephus 问题) 有n个人围成一圈,依次标号0至n-1。从第0号开始,以此0,1,0,1……的顺序报数,报到1的人会离开,直至圈中只余下一个人。求最后留下的人的编号。

时间:2024-09-17 19:20:17浏览次数:10  
标签:下标 Josephus 标记 int 编号 MAXN 人会 圈中 报数

/*
(Josephus 问题) 有n个人围成一圈,依次标号0至n-1。从第0号开始,以此0,1,0,1……的顺序报数,
报到1的人会离开,直至圈中只余下一个人。求最后留下的人的编号。
输入格式:
n
输出格式:
最后留下的人的编号
假设输入的是 10
F[] 0 0 0 0 0 0 0 0 0 0

标记情况:
 0 1 0 1 0 1 0 1 0 1
 0 1 1 1 0 1 1 1 0 1
 1 1 1 1 0 1 1 1 1 1
*/
//整体就是遇到第一个0,就标记为1,然后计数器加1,然后p异或1,然后i加1,然后i循环,直到计数器等于n-1
//最后再遍历一遍数组,找到第一个0的下标,输出即可
#include<iostream>
using namespace std;

const int MAXN = 1000000;
int F[MAXN];

int main(){
    int n;
    cin >> n;
    int i=0,p=0,c=0;//C计数器,p标记 i下标
    while(c+1<n){
        if(F[i]==0){
            if(p){//如果p为1
                F[i]=1;//标记
                c++;//计数器加1
            }
            p^=1;//通过异或运算,使p在0和1之间切换
        }
        i=(i+1)%n; //通过i让下标循环
    }
    int ans=-1;
    for(i=0;i<n;i++)
        if(F[i]==0)
           ans=i;
    cout << ans << endl;
    return 0;
}
#include <iostream>
using namespace std;

const int MAXN = 1000000;
int F[MAXN];

int main() {
    int n;
    cin >> n; // 读取人数

    // 初始化变量
    int i = 0, p = 0, c = 0; // i: 当前下标, p: 当前报数, c: 已标记的人数

    // 遍历直到标记 n-1 个人
    while (c + 1 < n) {
        if (F[i] == 0) { // 如果当前位置为0(未标记)
            if (p == 1) { // 如果当前报数为1
                F[i] = 1; // 标记为1
                c++; // 增加已标记人数
            }
            p ^= 1; // 切换报数(0变1,1变0)
        }
        i = (i + 1) % n; // 下标循环
    }

    // 查找并输出最后剩下的人的编号
    int ans = -1;
    for (i = 0; i < n; i++) {
        if (F[i] == 0) {
            ans = i;
            break;
        }
    }
    cout << ans << endl;
    return 0;
}

标签:下标,Josephus,标记,int,编号,MAXN,人会,圈中,报数
From: https://blog.csdn.net/laocooon/article/details/142298555

相关文章

  • 为什么很多人会选择学网络安全?前景如何?
    “网络安全”是当下十分热门的热词,受到了国家的高度重视与关注,并有关政策。在此背景之下,为了寻求新的职业发展机会,越来越多的朋友将目光聚焦于网络安全行业,那么为什么学习网络安全?网络安全课程前景如何?相信很多人都有所疑惑,接下来小编带你详细了解一下。为什么学习网络安......
  • 我写的NOIP 1.0(你觉得一个二级都没过的人会NOIP???)
    1835【04NOIP提高组】津津的储蓄计划1918【02NOIP普及组】级数求和 1961【13NOIP普及组】计数问题 1969【15NOIP普及组】金币 1414【17NOIP普及组】成绩 2086【22CSPJ普及组】乘方(pow) ......
  • echarts折线图实现矩形圈中的点可拖拽,圈外的点不可拖拽
    原生HTML+JavaScript版本<!DOCTYPEhtml><html><head><metacharset="utf-8"><title>曲线形式的统计图示例</title><scriptsrc="https://cdnjs.cloudflare.com/ajax/libs/echarts/4.9.0-rc.1/echarts.min.js&q......
  • 全方位介绍大数据生态圈中最基础、最重要的组件 Hadoop
    大数据概述大数据这个概念近年来算是如火如荼,那什么是大数据呢?首先从名字来看,我们可以简单地认为数据量大,而数据量大也就意味着计算量大。这样理解本身是没有任何问题的,只不过这并不能很好的定义大数据。而业界的一家权威的机构,针对大数据做了描述,认为大数据应该具备如下特征:1......
  • 在科技行业的热门趋势中,你必定无法忽视日益增长的人工智能大模型的影响力。无论是你热
    在科技行业的热门趋势中,你必定无法忽视日益增长的人工智能大模型的影响力。无论是你热衷浏览的短视频还是见不得的“AI绘画”,或者是你的朋友圈中充斥的“虚拟试衣”和智能聊天软件ChatGPT,这些都在告诉你,AI大模型正在为日常生活带来革命性的改变。今天,我们就来探讨如何使用AI大模型......
  • Josephus环(作业
    #include<stdio.h>#include<string.h>#include<stdlib.h>typedefstructnode{ intdata;//值 structnode*next;//嵌套定义结构体必须有名}linklist;intmain(){ //输入数字创建循环链表 linklist*head; linklist*s; linklist*r; intn=0; inti=1; he......
  • 剑指 Offer 62. 圆圈中最后剩下的数字(简单)
    题目:classSolution{public:intlastRemaining(intn,intm){intpos=0;for(inti=2;i<=n;i++){pos=(pos+m)%i;}returnpos;}};作者:想吃火锅的木易链接:https://leetcode.cn/problems/yuan-quan-zhong-z......
  • 【剑指Offer】46、圆圈中最后剩下的数
    【剑指Offer】46、圆圈中最后剩下的数题目描述:每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报......
  • “科创中国”大湾区青年百人会论坛成功举办
    2023年6月28日,“科创中国”大湾区青年百人会论坛在香港科技大学(广州)成功举办。多位大湾区杰出的青年学者齐聚现场,共同分享和研讨大湾区科研成果和发展趋势,线上线下共吸引了数千人次参与盛会。本次论坛以“湾”通世界、青年领航为主题,由“科创中国”青年百人会、广东省科学技术协会......
  • 现在网上流传的 35 岁很多人会失业,究竟是危言耸听,还是真实存在的?
    昨天BOSS直聘上有个47岁的软件开发人员投简历,应聘android应用开发工程师,还是有点诧异的。于是问他,这是个技术岗位,他是否偏重管理岗,项目经理什么的。他说他偏技术,是技术经理偏重技术的。我以为遇到个全才,毕竟95年毕业的本科生,211学校。当年大学没有扩招,应该是天之骄子了。工作25年了......