链接:https://vjudge.net/problem/HDU-4841

Task

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

Input

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

Output

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

Sample

input:

1
2
2 3
2 4

output:

1
2
3
GBBG

BGGB

Solution

建立2n的数组,0是好人,1是坏人,首先用memset初始化为全0。然后用双指针,指针i环形遍历所有人,指针t计数,如果当前是好人,则++t,否则t不变并将当前置为1。同时用计数器cnt计算已经选了多少个坏人,选完n个之后break 输出格式要注意

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<cstdio>
#include<cstring>
using namespace std;
const int MAX=32767*2;
bool answer[MAX];
int main(){
  int n,m;
  while(scanf("%d%d",&n,&m)!=EOF){
    memset(answer,0,sizeof(answer));
    int t=0, cnt=0;
    for(int i=0; i<=2*n; ++i){
      if(i==2*n) i=0;
      if(answer[i]==0) ++t;
      if(t==m) {answer[i]=1; t=0; ++cnt;}
      if(cnt==n) break;
    }
    int line_cnt=0;
    for(int i=0; i<2*n; ++i){
      if(answer[i]) printf("B");
      else          printf("G");
      ++line_cnt;
      if(line_cnt%50==0) printf("\n");
    }
    if(line_cnt%50==0) printf("\n");
    else               printf("\n\n");
  }
  return 0;
}