列表

详情


QY12. 红和绿

描述

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

输入描述

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

输出描述

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

示例1

输入:

RGRGR

输出:

2

原站题解

C 解法, 执行用时: 1ms, 内存消耗: 376KB, 提交时间: 2020-12-23

#include <stdio.h>
#include <string.h>
#define N 50
int main()
{
    char ch[N];
    scanf("%s",ch);
    int n,i,j,count=0;
    n=strlen(ch);
    int min=n;
    for(i=0;i<n;i++)
    {
        count=0;
        for(j=0;j<i;j++)
            if(ch[j]=='G')
                count++;
        for(j=i;j<n;j++)
            if(ch[j]=='R')
                count++;
        if(count<min)
            min=count;
    }
    printf("%d\n",min);
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 348KB, 提交时间: 2020-10-29

#include <stdio.h>
#include <string.h>
#define N 50
int main()
{
    char ch[N];
    scanf("%s",ch);
    int n,i,j,count=0;
    n=strlen(ch);
    int min=n;
    for(i=0;i<n;i++)
    {
        count=0;
        for(j=0;j<i;j++)
            if(ch[j]=='G')
                count++;
        for(j=i;j<n;j++)
            if(ch[j]=='R')
                count++;
        if(count<min)
            min=count;
    }
    printf("%d\n",min);
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 356KB, 提交时间: 2019-04-10

#include <stdio.h>
#include <string.h>
#define N 50
int main()
{
    char ch[N];
    scanf("%s",ch);
    int n,i,j,count=0;
    n=strlen(ch);
    int min=n;
    for(i=0;i<n;i++)
    {
        count=0;
        for(j=0;j<i;j++)
            if(ch[j]=='G')
                count++;
        for(j=i;j<n;j++)
            if(ch[j]=='R')
                count++;
        if(count<min)
            min=count;
    }
    printf("%d\n",min);
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 368KB, 提交时间: 2019-08-31

#include <stdio.h>
#include <string.h>

/*--------------------------------------
We regard N(i) as the difference degree between 
the input string and string "RR...RGGG..G" which
contains i 'R's, We called this string as "i string".

Then we get N(i+1) = N(i) + d_i, d_i = 1 if i-th character of input
string is the same as the i-th character of "i string"
----------------------------------------*/

int Find_min(char* ipstr, int n)
{
    int cur = 0, cur_min;
    for (int i = 0; i < n; i++){
        if (*(ipstr+i) != 'G')
            cur++;
    }
    cur_min = cur;
    for (int i = 0; i < n; i++){
        if (*(ipstr+i) == 'G'){
            cur++;
        }
        else{
            cur--;
            if (cur < cur_min){
                cur_min = cur;
            }
        }
    }
    return cur_min;
}

int main(){
    char s[51];
    scanf("%s", s);
    printf("%d", Find_min(s, strlen(s)));
}

C 解法, 执行用时: 2ms, 内存消耗: 368KB, 提交时间: 2019-05-26

#include <stdio.h>
#include <string.h>
#define N 50
int main()
{
    char ch[N];
    scanf("%s",ch);
    int n,i,j,count=0;
    n=strlen(ch);
    int min=n;
    for(i=0;i<n;i++)
    {
        count=0;
        for(j=0;j<i;j++)
            if(ch[j]=='G')
                count++;
        for(j=i;j<n;j++)
            if(ch[j]=='R')
                count++;
        if(count<min)
            min=count;
    }
    printf("%d\n",min);
    return 0;
}

上一题