圆桌问题(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))