hdu 4841 用stl::vector解决约瑟夫问题

Posted randy-lo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 4841 用stl::vector解决约瑟夫问题相关的知识,希望对你有一定的参考价值。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4841

约瑟夫问题,确定一个数m,共有n个人,循环报数,数到m就出队,后面的数跟在其后,这是一个典型的链表删除操作的应用,我先用vector写了一中操作方案,vector对于随机访问元素的时间复杂度是O(1),所以便于查询,而链表对于插入和删除的时间复杂度都是O(1),用vector进行删除操作的时间复杂度是O(n)的,用于后续元素的移位。

代码如下:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef unsigned int ui;
 4 typedef long long ll;
 5 typedef unsigned long long ull;
 6 #define pf printf
 7 #define mem(a,b) memset(a,b,sizeof(a))
 8 #define prime1 1e9+7
 9 #define prime2 1e9+9
10 #define pi 3.14159265
11 #define lson l,mid,rt<<1
12 #define rson mid+1,r,rt<<1|1
13 #define scand(x) scanf("%llf",&x) 
14 #define f(i,a,b) for(int i=a;i<=b;i++)
15 #define scan(a) scanf("%d",&a)
16 #define mp(a,b) make_pair((a),(b))
17 #define P pair<int,int>
18 #define dbg(args) cout<<#args<<":"<<args<<endl;
19 #define inf 0x7ffffff
20 inline int read(){
21     int ans=0,w=1;
22     char ch=getchar();
23     while(!isdigit(ch)){if(ch==-)w=-1;ch=getchar();}
24     while(isdigit(ch))ans=(ans<<3)+(ans<<1)+ch-0,ch=getchar();
25     return ans*w;
26 }
27 int n,m,t;
28 const int maxn=1e4+10;
29 vector<int>v ;
30 int main()
31 {
32     //freopen("input.txt","r",stdin);
33     //freopen("output.txt","w",stdout);
34     std::ios::sync_with_stdio(false);
35     int t=0; 
36     while(scanf("%d%d",&n,&m)!=EOF)
37     {
38         t++;
39         v.clear();
40         f(i,0,2*n-1)v.push_back(i);//保存的是位置信息,最终将确定剩余的n个位置 
41         int pos=0;
42         f(i,1,n)//删除n次 
43         {
44             pos=(pos+m-1)%((int)v.size());// 从当前位置(pos+0)位置开始,直到pos+m-1位置
45             v.erase(v.begin()+pos); 
46         }
47         int j=0;
48         f(i,0,2*n-1)
49         {
50             if(!(i%50)&&i)pf("
");//每五十个字符一行 
51                 if(j<v.size()&&v[j]==i)
52                 {
53                     pf("G");
54                     j++;
55                 }
56                 else pf("B");    
57         }
58         pf("

");
59     }
60 } 

 

以上是关于hdu 4841 用stl::vector解决约瑟夫问题的主要内容,如果未能解决你的问题,请参考以下文章

hdu4841 圆桌问题

vector的使用-Hdu 4841

hdu4841_圆桌问题

HDU4841 圆桌问题(vector的妙用)

HDU 4841 : 圆桌问题

hdu 4841 圆桌问题 | vector 容器的使用