圆桌问题(hdu4841)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了圆桌问题(hdu4841)相关的知识,希望对你有一定的参考价值。

圆桌问题

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 1038    Accepted Submission(s): 446


Problem Description
圆桌上围坐着2n个人。其中n个人是好人,另外n个人是坏人。如果从第一个人开始数数,数到第m个人,则立即处死该人;然后从被处死的人之后开始数数,再将数到的第m个人处死……依此方法不断处死围坐在圆桌上的人。试问预先应如何安排这些好人与坏人的座位,能使得在处死n个人之后,圆桌上围坐的剩余的n个人全是好人。
 

Input
多组数据,每组数据输入:好人和坏人的人数n(<=32767)、步长m(<=32767);
 

Output
对于每一组数据,输出2n个大写字母,‘G’表示好人,‘B’表示坏人,50个字母为一行,不允许出现空白字符。相邻数据间留有一空行。
 

Sample Input

2 3

     2 4 

 

Sample Output
GBBG

BGGB

模拟一下就可以了,删除队列中的元素用vector。

先出来的p个人都是B.

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<string.h>
 5 #include<math.h>
 6 #include<vector>
 7 #include<queue>
 8 #include<stack>
 9 using namespace std;
10 vector<int>my;
11 int a[80000];
12 char paidui[80000];
13 int main(void)
14 {
15     int n,i,j,k,p,q;
16     int cnt;
17     int id;
18     int ans;
19     int uu;
20     while(scanf("%d %d",&p,&q)!=EOF)
21     {
22         cnt=0;
23         ans=1;
24         memset(paidui,0,sizeof(paidui));
25         my.clear();
26         int countt=2*p;
27         for(i=1; i<=2*p; i++)
28         {
29             my.push_back(i);
30         }
31         int biao=q%(2*p);//biao表示删除的下标
32         uu=1;//表示在某次操作前要删除的元素,
33         while(cnt<p)
34         {
35             if(biao==0)
36             {
37                 biao=countt;
38                 countt-=uu;
39                 uu=0;
40                 a[cnt++]=my[biao-1];
41                 my.erase(my.end()-1);
42                 biao=q%countt;
43                 uu++;
44             }
45             else
46             {
47                 if(biao+q>countt)
48                 {
49                     int vc=q;
50                     vc-=(countt-biao);
51                     a[cnt++]=my[biao-uu];
52                     my.erase(my.begin()+biao-uu);
53                     countt-=uu;
54                     biao=vc%countt;
55                     uu=0;
56                     uu++;
57 
58                 }
59                 else
60                 {
61                     a[cnt++]=my[biao-uu];
62                     my.erase(my.begin()+biao-uu);
63                     biao=(biao+q)%countt;
64                     uu++;
65                 }
66             }
67 
68         }
69         for(i=0; i<cnt; i++)
70         {
71             paidui[a[i]]=B;
72         }
73         for(i=1; i<=2*p; i++)
74         {
75             if(!paidui[i])
76             {
77                 paidui[i]=G;
78             }
79         }
80         for(i=1; i<=2*p; i++)
81         {
82             printf("%c",paidui[i]);
83             if(i%50==0)
84                 printf("\n");
85         }
86         printf("\n");printf("\n");
87     }
88     return 0;
89 }
 

以上是关于圆桌问题(hdu4841)的主要内容,如果未能解决你的问题,请参考以下文章

HDU4841 圆桌问题(vector的妙用)

hdu4841_圆桌问题

HDU 4841 : 圆桌问题

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

vector的使用-Hdu 4841

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