题解 P1996 【约瑟夫问题】
这题我原来打的暴力,但当我学了数据结构后,发现队列居然跑得如此轻松!
约瑟夫问题最难的就是人数在不断变化,数组模拟是很麻烦的,但是线性数据结构的数据数也是不定的,这个问题自然也就迎刃而解了。而这道题,我选择了队列这种先进先出的数据结构。(其实是因为我链表没学好)
我们从1开始数到
接下来就是你们最喜欢的代码了(15ms,788KB):
#include<bits/stdc++.h>//漂亮的万能头
using namespace std;
int n,m;
queue<int>q;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
q.push(i);
}
while(!q.empty()){
for(int i=1;i<m;i++){//注意:是m-1次
q.push(q.front());//将头部放至尾部
q.pop();
}
cout<<q.front()<<" ";//出列+输出
q.pop();
}
return 0;
}
/*STL的数据结构真好用*/
希望看到此题解的童鞋们NOIp2019rp++!!!