3 solutions

  • 0
    @ 2022-7-11 10:00:39

    我感觉的的写法还挺简单的(手动狗头)

    #include<iostream>
    #include<queue>
    using namespace std;
    int main(){
    	int n,m;
    	cin>>n>>m;
    	queue<int>nums; 
    	for(int i = 1;i <= n; i++){
    		nums.push(i);
    	}
    	while(true){
    		for(int i = 0; i <= m-2; i++){
    			int num;
    			num = nums.front();
    			nums.push(num);
    			nums.pop();
    		}
    		cout<<nums.front()<<" ";
    		nums.pop();
    		if(nums.empty()){
    			break;
    		}
    	}
    	return 0;
    }
    • 0
      @ 2022-3-24 20:14:46

      感觉我这种写法还是比较不好,空间开销有点大了,不知道有没有大佬有更好的写法....

      #include<bits/stdc++.h>
      using namespace std;
      queue<int>  q;  //初始队
      queue<int> q1;  //存放临时数据,临时队
      queue<int>   q2;   //存放最终结果,结果队
      int main(){
          int n,m;
          cin>>n>>m;
          for(int i=1;i<=n;i++){
              q.push(i);
          }
      
          int index=0;
          while(!q.empty()){
               int temp=q.size();
               index=m%temp;
               int q1_number;  //存放临时出队的点
      
               if(index==0)  index+=temp;
               for(int j=0;j<index-1;j++){   //将点存放在临时队
                  q1_number=q.front();
                   q1.push(q1_number);
                  q.pop();
               }
      
             q1_number=q.front();
             q2.push(q1_number);  //插入结果队
             q.pop();
      
             for(int j=0;j<index-1;j++){    //恢复现场,将临时队的内容按顺序返回到初始队中
                 q1_number=q1.front();
                 q.push(q1_number);
                 q1.pop();
             }
          }
      
          for(int i=1;i<=n;i++){
              cout<<q2.front()<<" ";
              q2.pop();
          }
      return 0;
      }
      
      
      • 0
        @ 2022-3-3 0:19:13

        真好,这个约瑟夫问题不用写队列

        #include<iostream>
        #include<cstdio>
        #include<cmath>
        #include<cstdlib>
        #include<cstring>
        #include<algorithm>
        #include<vector>
        #include<string>
        #include<map>
        
        
        using namespace std;
        bool vis[100005];
        int main(void)
        {
        	int n, t;
        	cin >> n >> t;
        	int cnt = n;
        	int x = 0;
        
        	while (cnt)
        	{
        		for (int i = 1; i <= t; i++)
        		{
        			x++;
        			if (x > n) x -= n;
        			while (vis[x] && x <= n)
        			{
        				x++;
        				if (x > n) x -= n;
        			}
        
        		}
        
        		if (!vis[x])
        		{
        			cnt--;
        			vis[x] = true;
        		}
        		 cout << x << " ";
        	}
        
        	return 0;
        }
        
        • 1

        Information

        ID
        301
        Time
        1000ms
        Memory
        128MiB
        Difficulty
        4
        Tags
        # Submissions
        72
        Accepted
        35
        Uploaded By