链接:https://vjudge.net/problem/HDU-4841
Task
圆桌上围坐着2n个人。其中n个人是好人,另外n个人是坏人。如果从第一个人开始数数,数到第m个人,则立即处死该人;然后从被处死的人之后开始数数,再将数到的第m个人处死……依此方法不断处死围坐在圆桌上的人。试问预先应如何安排这些好人与坏人的座位,能使得在处死n个人之后,圆桌上围坐的剩余的n个人全是好人。
多组数据,每组数据输入:好人和坏人的人数n(<=32767)、步长m(<=32767);
Output
对于每一组数据,输出2n个大写字母,‘G’表示好人,‘B’表示坏人,50个字母为一行,不允许出现空白字符。相邻数据间留有一空行。
Sample
input:
output:
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;
}
|