其他分享
首页 > 其他分享> > hduoj圆桌问题

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 }

 

标签:register,int,hduoj,约瑟夫,问题,tie,取余,圆桌
来源: https://www.cnblogs.com/LQS-blog/p/16226015.html