3 solutions
-
0
我感觉的的写法还挺简单的(手动狗头)
#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
感觉我这种写法还是比较不好,空间开销有点大了,不知道有没有大佬有更好的写法....
#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
真好,这个约瑟夫问题不用写队列
#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