圆桌问题(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
GBBGBGGB
模拟一下就可以了,删除队列中的元素用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 }
油!油!you@