[CF从零单排#15]266B - Queue at the School

题目来源:http://codeforces.com/problemset/problem/266/B

During the break the schoolchildren, boys and girls, formed a queue of n people in the canteen. Initially the children stood in the order they entered the canteen. However, after a while the boys started feeling awkward for standing in front of the girls in the queue and they started letting the girls move forward each second.

Let's describe the process more precisely. Let's say that the positions in the queue are sequentially numbered by integers from 1 to n, at that the person in the position number 1 is served first. Then, if at time x a boy stands on the i-th position and a girl stands on the (i + 1)-th position, then at time x + 1 the i-th position will have a girl and the (i + 1)-th position will have a boy. The time is given in seconds.

You've got the initial position of the children, at the initial moment of time. Determine the way the queue is going to look after t seconds.

Input
The first line contains two integers n and t (1 ≤ n, t ≤ 50), which represent the number of children in the queue and the time after which the queue will transform into the arrangement you need to find.

The next line contains string s, which represents the schoolchildren's initial arrangement. If the i-th position in the queue contains a boy, then the i-th character of string s equals "B", otherwise the i-th character equals "G".

Output
Print string a, which describes the arrangement after t seconds. If the i-th position has a boy after the needed time, then the i-th character a must equal "B", otherwise it must equal "G".

Examples
input
5 1
BGGBG
output
GBGGB
input
5 2
BGGBG
output
GGBGB
input
4 1
GGGB
output
GGGB

题目大意:

'B'表示男孩,'G'表示女孩。如果第x秒,男孩在女孩前面,下一秒(x+1秒)他们的位置要互换一下。问在一个长度为n的队伍里面,知道初始化位置,经过t秒后,队伍会变成怎么样,把最后的队伍输出来。

题目分析:

模拟题,细节题。在一轮中,扫描一遍整个队伍,如果在i位置出现B,且在i+1位置是G,那么交换他们的位置,并且需要注意i要跳过i+1。因为那个是在一秒内完成的,也就是下一个要扫描的对象是从i+2位置开始询问,这个地方容易出错。那么有t秒,也就是要进行t轮扫描。两个循环可以解决。

参考代码:

#include <bits/stdc++.h>
using namespace std;
int main(){
	char s[100];
	int n, t;
	cin >> n >> t;
	for(int i=0; i<n; i++)
		cin >> s[i];
	for(int i=1; i<=t; i++){
		int j = 0;
		while(j<n-1){
			if(s[j]=='B' && s[j+1]=='G'){
				char ch = s[j];
				s[j] = s[j+1];
				s[j+1] = ch;
				j ++;
			}
			j ++;
		} 
	}
	for(int i=0; i<n; i++)
		cout << s[i];
	return 0;
}

一开始输出的时候用cout << s,会出错,这是因为s[]毕竟是一个数组,后面可能有其他的字符,因此还是严格按照0~n-1的位置输出,保证不会出错。

猜你喜欢

转载自www.cnblogs.com/gdgzliu/p/13383531.html
今日推荐