hduoj圆桌问题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4841
经典模拟问题约瑟夫问题,约瑟夫以前说过了,不在赘述;
这里采用的方法是STL法和模拟法;
模拟圆桌实验和约瑟夫实验,进行kick off;
其实还是蛮好想的,也是对模拟的考验;
几个小点:
1 for(register int i=0;i<n;i++) 2 { 3 pos=(pos+m-1)%t.size();//因为圆桌是个环,所以进行取余操作 4 t.erase(t.begin()+pos);//赶走坏人,长度减一 5 }
这里进行取余操作是因为圆桌是圆环,所以进行取余操作不会超出,思想近似于循环队列
1 for(register int i=0;i<2*n;i++) 2 { 3 if(!(i%50)&&i)//打印换行 4 cout<<endl; 5 if(j<t.size()&&i==t[j])//在长度范围内并且这个数组的元素和下标相等,因为是从下标一一赋过去的 6 { 7 j++;//下一个好人 8 cout<<'G';//好银 9 } 10 else 11 cout<<'B';//坏银 12 }
对于变量j的操作和取余操作的注意点也在注释中写了;
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 std::ios::sync_with_stdio(false); 6 cin.tie(0); 7 cout.tie(0); 8 int n,m; 9 vector<int>t; 10 while(cin>>n>>m) 11 { 12 int pos=0;//删除的下标 13 t.clear(); 14 for(register int i=0;i<2*n;i++) 15 t.push_back(i); 16 for(register int i=0;i<n;i++) 17 { 18 pos=(pos+m-1)%t.size();//因为圆桌是个环,所以进行取余操作 19 t.erase(t.begin()+pos); 20 } 21 int j=0;//记录标记下标 22 for(register int i=0;i<2*n;i++) 23 { 24 if(!(i%50)&&i)//打印换行 25 cout<<endl; 26 if(j<t.size()&&i==t[j])//在长度范围内并且这个数组的元素和下标相等,因为是从下标一一赋过去的 27 { 28 j++;//下一个好人 29 cout<<'G';//好银 30 } 31 else 32 cout<<'B';//坏银 33 } 34 cout<<endl<<endl;//符合题目输出形式 35 } 36 37 return 0; 38 }
本文来自博客园,作者:江上舟摇,转载请注明原文链接:https://www.cnblogs.com/LQS-blog/p/16226015.html