爱奇艺2018秋招C++ [编程题]红和绿

链接:https://www.nowcoder.com/questionTerminal/4ea618c551404efc8299c2eaac733329 来源:牛客网
牛牛有一些排成一行的正方形。每个正方形已经被染成红色或者绿色。牛牛现在可以选择任意一个正方形然后用这两种颜色的任意一种进行染色,这个正方形的颜色将会被覆盖。牛牛的目标是在完成染色之后,每个红色R都比每个绿色G距离最左侧近。牛牛想知道他最少需要涂染几个正方形。
如样例所示: s = RGRGR
我们涂染之后变成RRRGG满足要求了,涂染的个数为2,没有比这个更好的涂染方案。

输入描述:

输入包括一个字符串s,字符串s长度length(1 ≤ length ≤ 50),其中只包括'R'或者'G',分别表示红色和绿色。

输出描述:

输出一个整数,表示牛牛最少需要涂染的正方形数量

示例1

输入

RGRGR

输出

2

思路:1.首先记录每一个位置(包括该位置)之前R的总个数个G的总个数
2. 从左往右,找到第一个为G的位置,假设从该位置起,前面的全变为R,后面的全变为G,总共需要改变多少次?
3. 即计算该位置之前G的个数(需要变成R)和该位置之后R的个数(需要变成G),并求和
4. 同理,找到下一个G的位置,计算该位置前面G的个数,后面R的个数,并求和
5. 遍历到最后,取所有求和结果中的最小值

#include <iostream>
#include <string>
#include <string.h>
#include <vector>
using namespace std;

int main()
{
	int len;
	int count=0;
	int count_r =0, count_g = 0;
	string S;
	cin >> S;
	len = S.length();
	vector<int>vecr(len,0);
	vector<int>vecg(len,0);

	for (int i = 0; i < len; i++) {
		if (S[i] == 'R') {
			count_r++;
		}
		vecr[i] = count_r;
		if (S[i] == 'G') {
			count_g++;
		}
		vecg[i] = count_g;
	}

	int min = 50;
	for (int i = 0; i < len; i++) {
		if (S[i] == 'G') {
			count = vecg[i] - 1 + (vecr[len - 1] - vecr[i]);
			if (count < min)
				min = count;
		}
	}
	cout << min;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/dlwsd_/article/details/83759296