B. Vova and Trophies

题目原址

http://codeforces.com/contest/1082/problem/B

题目内容

给定一个包含GS字母的字符串,要求只允许进行一次GS交换,求所得最大连续G串长度。

题目解析

就是找在给定字符串s中,只间隔一个S的两个G串的最大长度。因为这中间的一个S可以被其他G换过来从而使得两个G串相连,成为最大连续G串。

注意:换过来的那个G可能来自于一个无关G串,也有可能只能来自本身的两个G串,因此还需要判断在交换后是否会获得长度收益。

举个例子,像SSSGGSGGS这样的字符串进行交换后最大长度 = 两串长度之和,而GSSGGSGG这样的字符串交换后最大长度 = 两串长度+1。

因此,除了寻找最大间隔串以外,还需对总体计数,如果两串之和 = 串中G的数量,则交换后没有收益,即

ans=min(ans,sum);

仔细回想一下如何寻找结果的。

遍历s串,先记录第一个连续的G串的长度,倘若遇到S则将结果先交给temp,然后重新记录第二个连续G串的长度,在遇到下一个S之前,ans内存储的就是这两个连续串的长度之和再+1交换收益(假设有的话)。

int sum = 0, g = 0, temp = 0, ans = 0;
    for(int i = 0; i < n; i++)
    {
        if(s[i] == 'G')
        {
            sum++; g++;
        }
        else
        {
            temp = g; g = 0;
        }
        ans=max(ans,temp+g+1);
    }

题目总结

反复回顾本题,就会逐渐学会字符串搜索之类的题目。

另:题官方的标签中给出了Greedy algorithm(贪婪算法)。

For you, Xh.
原文地址:https://www.cnblogs.com/Little-Rabbit/p/10066466.html