首页 > 试题广场 >

红和绿

[编程题]红和绿
  • 热度指数:7541 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
牛牛有一些排成一行的正方形。每个正方形已经被染成红色或者绿色。牛牛现在可以选择任意一个正方形然后用这两种颜色的任意一种进行染色,这个正方形的颜色将会被覆盖。牛牛的目标是在完成染色之后,每个红色R都比每个绿色G距离最左侧近。牛牛想知道他最少需要涂染几个正方形。
如样例所示: s = RGRGR
我们涂染之后变成RRRGG满足要求了,涂染的个数为2,没有比这个更好的涂染方案。

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


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

输入

RGRGR

输出

2
s = list(input())
num = len(s)
for i in range(len(s)+1):
    num = min(num, s[:i].count('G')+s[i:].count('R'))
print(num)

发表于 2019-04-15 10:19:58 回复(0)

  1. 思路:G遍历涂的个数 和 (R总 - 已遍历的个数) 的最小和
  2. 注意:左边全为G,右边全为R 的情况
  3. 时间复杂度O(n),空间复杂度O(1)
mystr = input()
mymin = Ry = Rcount = mystr.count('R')
GChangeCount = 0
for item in mystr:
    if item == 'G':
        GChangeCount +=1
    else:
        Rcount -=1
    if GChangeCount>=Ry and Ry == Rcount:
        mymin = Rcount
        break
    if Rcount+GChangeCount < mymin:
        mymin = Rcount+GChangeCount
    if Rcount == 0:
        break
print(mymin)


编辑于 2019-04-12 20:34:42 回复(0)
s=input()
res=[]
for i in range(len(s)):
    res.append(s[:i].count('G')+s[i:].count('R'))
print(min(res))

发表于 2019-03-31 15:16:44 回复(1)

python两行

暴力枚举的,感觉不够优雅。

每个位置都试一遍,假设为红与绿的分界点,在这些结果里面找到最小值。

例如对于位置i,左边全部要染成红色,右边全部要染成绿色,则当前的值为s[:i].count('G') + s[i:].count('R')

代码如下:

s = input()
print(min(map(lambda i: s[:i].count('G') + s[i:].count('R'), range(0, len(s) + 1))))
发表于 2019-03-15 22:00:39 回复(2)
暴力解:
input_s = list(input().strip())
min_num = float('inf')
for i in range(len(input_s)):
    temp_num = 0
    for j in range(i):
        if input_s[j] != 'R':
            temp_num += 1
    for j in range(i, len(input_s)):
        if input_s[j] != 'G':
            temp_num += 1
    min_num = min(min_num, temp_num)
print(min_num)

发表于 2019-02-19 13:29:12 回复(0)
s = list(input())
n = len(s)
min_num = n
for i in range(0,n):
    R_num = s[:i].count('G')
    G_num = s[i:].count('R')
    if R_num + G_num < min_num :
        min_num = R_num + G_num
print(min_num)

发表于 2019-02-16 14:46:59 回复(1)