洛谷P2697 宝石串

题目链接:https://www.luogu.com.cn/problem/P2697

题目描述

有一种宝石串,由绿宝石和红宝石串成,仅当绿宝石和红宝石数目相同的时候,宝石串才最为稳定,不易断裂。安安想知道从给定的宝石串中,可以截取一段最长的稳定的宝石串,有多少颗宝石组成。请你帮助他。

绿宝石用‘G’表示,红宝石用‘R'表示。

输入格式

一行由G和R组成的字符串

输出格式

最长的稳定的宝石串有多少颗宝石组成

输入输出样例

输入 #1
GRGGRG
输出 #1
4

说明/提示

RGGR为答案。

宝石数<=1000000

这是一道贪心题,要求出从1到i之间G比R多的个数然后再用数组记录下对应最小的i的最的大的i,最后在算出最大i和最小i的差的最大值即为答案。

代码:

#include<stdio.h>
#include<string.h>
#include<malloc.h>
struct node{
    int b,e,f;
};
char s[1000001];
int r=0,maxx=0;
int main(){
    struct node*k=(struct node*)malloc(24000012),*a=k+1000000;
    memset(k,0,24000012);
    int lenk=0;
    while((s[lenk]=getchar())!='
'&&s[lenk]!=EOF)lenk++;
    s[lenk]='';
    a[0].b=0;a[0].f=1;
    for(int i=0;i<lenk;i++){
        if(s[i]=='G')r++;else r--;
        if(a[r].f==0){a[r].b=i+1;a[r].f=1;}
        a[r].e=i+1;
    }
    for(int i=-lenk;i<=lenk;i++)if(a[i].e-a[i].b>maxx)maxx=a[i].e-a[i].b;
    printf("%d",maxx);
    free(k);
    return 0;
}

 我可能写的不好,如果有问题,请帮忙指出,谢谢。

原文地址:https://www.cnblogs.com/sy666/p/12775283.html