zoukankan      html  css  js  c++  java
  • 约瑟夫问题

    总时间限制: 
    1000ms
     
    内存限制: 
    65536kB
    描述
    约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。

    输入
    每行是用空格分开的两个整数,第一个是 n, 第二个是 m ( 0 < m,n <=300)。最后一行是:

    0 0

    输出
    对于每行输入数据(最后一行除外),输出数据也是一行,即最后猴王的编号
    样例输入
    6 2
    12 4
    8 3
    0 0
    样例输出
    5
    1
    7
      既然这题的归类是链表与指针,那首先就是用链表模拟啦,注意特殊情况如 N=1,M=1 
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<cmath>
     5 #include<algorithm>
     6 #include<cstring>
     7 using namespace std;
     8 int next[3000];
     9 int last[3000];
    10 bool vis[3000];
    11 int N,M;
    12 int now;
    13 int num;
    14 int cnt;
    15 bool jud;
    16 int main(){
    17     for(;;){
    18         memset(next,0,sizeof(next));
    19         memset(last,0,sizeof(last));
    20         memset(vis,false,sizeof(vis));
    21         scanf("%d%d",&N,&M);
    22         if(N==1){
    23             cout<<1<<endl;
    24             continue;
    25         }
    26         if(N==M&&M==0){
    27             return 0;
    28         }
    29         for(int i=1;i<=N;i++){
    30             if(i!=N) next[i]=i+1,last[i+1]=i;
    31             else next[N]=1,last[1]=N;
    32         }
    33         now=num=1; jud=false;
    34         cnt=N;
    35         for(;;){
    36             if(now==N+1) now=1;
    37             if(num==M&&vis[now]==false){
    38                 num=1;
    39                 next[last[now]]=next[now];
    40                 last[next[now]]=last[now];
    41                 vis[now]=true;
    42                 cnt--;
    43                 if(cnt==1){
    44                     for(int i=1;i<=N;i++){
    45                         if(vis[i]==false){
    46                             cout<<i<<endl;
    47                             jud=true;
    48                             break;
    49                         }
    50                     }
    51                 }
    52                 if(jud==true) break;
    53                 now++;
    54             }
    55             else if(vis[now]==true) now++;
    56             else if(vis[now]==false) now++,num++;
    57         }
    58     }
    59     return 0;
    60 } 

      还可以:

     1 #include<iostream>
     2 using namespace std;
     3 int a[301];
     4 int main(){
     5     int n,m;
     6     while(1){
     7          cin>>n>>m;
     8          if(m==0&&n==0) return 0;
     9          a[1]=0;
    10          for(int i=2;i<=n;i++){
    11              a[i]=(a[i-1]+m)%i;
    12          }
    13          cout<<a[n]+1<<endl;
    14      }
    15 }
     
  • 相关阅读:
    php命令注入
    mysql事物
    安装php环境
    移除服务器缓存实例
    show user profile synchronization tools
    manual start user profile import
    JSON is undefined. Infopath Form People Picker in SharePoint 2013
    asp.net web 应用站点支持域账户登录
    Load sharepoint envirement by powershell
    sharepoint 2016 download
  • 原文地址:https://www.cnblogs.com/CXCXCXC/p/4905972.html
Copyright © 2011-2022 走看看