zoukankan      html  css  js  c++  java
  • Educational Codeforces Round 55 (Rated for Div. 2) B. Vova and Trophies (贪心+字符串)

    B. Vova and Trophies
    time limit per test2 seconds
    memory limit per test256 megabytes
    inputstandard input
    outputstandard output
    Vova has won n trophies in different competitions. Each trophy is either golden or silver. The trophies are arranged in a row.

    The beauty of the arrangement is the length of the longest subsegment consisting of golden trophies. Vova wants to swap two trophies (not necessarily adjacent ones) to make the arrangement as beautiful as possible — that means, to maximize the length of the longest such subsegment.

    Help Vova! Tell him the maximum possible beauty of the arrangement if he is allowed to do at most one swap.

    Input
    The first line contains one integer n (2≤n≤105) — the number of trophies.

    The second line contains n characters, each of them is either G or S. If the i-th character is G, then the i-th trophy is a golden one, otherwise it's a silver trophy.

    Output
    Print the maximum possible length of a subsegment of golden trophies, if Vova is allowed to do at most one swap.

    Examples
    inputCopy
    10
    GGGSGGGSGG
    outputCopy
    7
    inputCopy
    4
    GGGG
    outputCopy
    4
    inputCopy
    3
    SSS
    outputCopy
    0
    Note
    In the first example Vova has to swap trophies with indices 4 and 10. Thus he will obtain the sequence "GGGGGGGSGS", the length of the longest subsegment of golden trophies is 7.

    In the second example Vova can make no swaps at all. The length of the longest subsegment of golden trophies in the sequence is 4.

    In the third example Vova cannot do anything to make the length of the longest subsegment of golden trophies in the sequence greater than 0.

    题意:

    思路:

    标程写的挺好的,推荐一下吧。

    细节见代码:

    #include <bits/stdc++.h>
    
    using namespace std;
    
    int n;
    string s;
    
    int main() {
    	
    	cin >> n >> s;
    	
    	vector <int> l(n), r(n);
    	for(int i = 0; i < n; ++i){
    		if(s[i] == 'G'){
    			l[i] = 1;
    			if(i > 0) l[i] += l[i - 1];
    		}
    	}
    	for(int i = n - 1; i >= 0; --i){
    		if(s[i] == 'G'){
    			r[i] = 1;
    			if(i + 1 < n) r[i] += r[i + 1];
    		}
    	}
    	
    	
    	int res = 0;
    	int cntG = 0;
    	for(int i = 0; i < n; ++i)
    			cntG += s[i] == 'G';
    			
    	for(int i = 0; i < n; ++i){
    		if(s[i] == 'G') continue;
    		int nres = 1;
    		if(i > 0) nres += l[i - 1];
    		if(i + 1 < n) nres += r[i + 1];
    		res = max(res, nres);
    	}
    	
    	res = min(res, cntG);
    	if(cntG == n) res = cntG;
    	cout << res << endl;
    	return 0;
    }
    
    本博客为本人原创,如需转载,请必须声明博客的源地址。 本人博客地址为:www.cnblogs.com/qieqiemin/ 希望所写的文章对您有帮助。
  • 相关阅读:
    针对数据库开发人员的性能调优小提示
    Oracle EBS 12 目录结构
    程序集反射
    DataTable.Select() 返回DataTable结果
    有趣的23中设计模式
    『原创』用C++开发WM应用系列(5)——接触ListBox控件
    『原创』用C++开发WM应用系列(1)——"Hello World" Pro!(上)
    【参考】在PPC上面检查文件MD5
    用C++开发WM应用系列文章索引
    『原创』用C++开发WM应用系列(1)——"Hello World" Pro!(下)
  • 原文地址:https://www.cnblogs.com/qieqiemin/p/11184653.html
Copyright © 2011-2022 走看看