牛牛有一些排成一行的正方形。每个正方形已经被染成红色或者绿色。牛牛现在可以选择任意一个正方形然后用这两种颜色的任意一种进行染色,这个正方形的颜色将会被覆盖。牛牛的目标是在完成染色之后,每个红色R都比每个绿色G距离最左侧近。牛牛想知道他最少需要涂染几个正方形。 如样例所示: s = RGRGR 我们涂染之后变成RRRGG或RRRRR就满足要求了,涂染的个数都为2,没有涂染个数更少的方案了。 输入描述: 输入包括一个字符串s,字符串s长度length(1 ≤ length ≤ 50),其中只包括'R'或者'G',分别表示红色和绿色。 输出描述: 输出一个整数,表示牛牛最少需要涂染的正方形数量
时间: 2023-04-03 15:01:57 浏览: 197
我可以回答这个问题。这是一个贪心算法的问题。我们可以从左到右扫描字符串s,记录当前红色R和绿色G的数量,同时记录当前最少需要涂染的正方形数量。当扫描到一个红色R时,如果当前已经有更多的绿色G,那么就需要涂染这个正方形,同时更新最少需要涂染的正方形数量。同理,当扫描到一个绿色G时,如果当前已经有更多的红色R,也需要涂染这个正方形,并更新最少需要涂染的正方形数量。最后输出最少需要涂染的正方形数量即可。
代码实现如下:
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
cin >> s;
int n = s.length();
int cntR = , cntG = , ans = n;
for (int i = ; i < n; i++) {
if (s[i] == 'R') {
cntR++;
ans = min(ans, cntR - cntG);
} else {
cntG++;
ans = min(ans, cntG - cntR);
}
}
cout << ans << endl;
return ;
}
阅读全文