• 【题解】约瑟夫问题


    题目描述

    nn 个人围成一圈,从第一个人开始报数,数到 mm 的人出列,再由下一个人重新从 11 开始报数,数到 mm 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。

    输入格式
    输入两个整数 n,mn,m。

    输出格式
    输出一行 nn 个整数,按顺序输出每个出圈人的编号。

    输入输出样例
    输入 #1
    10 3
    输出 #1
    3 6 9 2 7 1 8 5 10 4
    说明/提示
    1 le m, n le 1001≤m,n≤100


    模拟

    模拟这个过程,然后接下来一个一个去做,vis记录全过程。但必须要开始将其值设置为flase。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int n,m,ans=0;
     4 bool vis[1000]={0};
     5 int main(){
     6     cin>>n>>m;
     7     for(int i=0;i<n;i++){
     8         for(int i=0;i<m;i++){
     9             ans++;
    10             if(n<ans)ans=1;
    11             if(vis[ans])i-=1;
    12         }
    13         cout<<ans<<" ";
    14         vis[ans]=1;
    15     }
    16     return 0;
    17 }

    队列

    与模拟差不多。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int n,m,ans=1;
     4 queue<int> qu;
     5 int main(){
     6     cin>>n>>m;
     7     for(int i=1;i<=n;i++){
     8         qu.push(i);
     9     }
    10     while(!qu.empty()){
    11         if(ans==m){
    12             cout<<qu.front()<<" ";
    13             qu.pop();
    14             ans=1;
    15         }else{
    16             ans++;
    17             qu.push(qu.front());
    18             qu.pop();
    19         }
    20     }
    21     return 0;
    22 }
  • 相关阅读:
    P2167 [SDOI2009]Bill的挑战
    P2153 [SDOI2009]晨跑
    洛咕 P2155 [SDOI2008]沙拉公主的困惑
    洛咕 P2465 [SDOI2008]山贼集团
    洛咕 P2463 [SDOI2008]Sandy的卡片
    洛咕 P4556 [Vani有约会]雨天的尾巴
    CF418D Big Problems for Organizers
    CF28D Don't fear, DravDe is kind
    CF97C Winning Strategy
    P4427 [BJOI2018]求和
  • 原文地址:https://www.cnblogs.com/rebirth-death2019/p/13778650.html
Copyright © 2020-2023  润新知