• B. Vova and Trophies 字符串预处理+思维+贪心


    题意:给出一个字符串 只有G和S  可以交换任意两个位置的字符一次 问 最长的G的长度是多少

    思路:预处理字符串 把相同的G粘成一个G 记一下数量  字符串变为 GSSGSGGSGSSG 相邻有一个S的即可粘在一起

    这里要考虑字符串中有多少个部分G   假设有zz部分  如果zz 大于等于3 那么两个G移动后连在一起就是  num[i]+num[j]+1 如果ZZ只有2  那就是 num[j]+num[i] 

    这里要考虑初始化  初始化如果zz>=2  则初始化成 num[i]+1 否则就初始化成num[i]  (不然会WA13 别问我为什么知道的)

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int maxn=2e5+6;
     4 char  s[maxn],s2[maxn];
     5 int num[maxn];
     6 int main(){
     7     int len;
     8     scanf("%d",&len);
     9     scanf("%s",s+1);
    10     //len=strlen(s+1);
    11     int flag=1;
    12     int zz=0;
    13     int ans=0;
    14     for(int i=1;i<=len;i++){
    15         if(s[i]=='G'){
    16             int cnt=0;
    17             while(cnt<=len&&s[i]=='G'){
    18                 cnt++;
    19                 i++;
    20             }
    21             zz++;
    22             s2[flag]='G';
    23             num[flag++]=cnt;
    24             i--;
    25         }
    26         else {
    27             s2[flag++]='S';
    28         }
    29     }
    30     //for(int i=1;i<=flag-1;i++){
    31         //cout<<s2[i]<<" "<<num[i]<<endl;
    32 //    }
    33     
    34     for(int i=1;i<=flag-1;i++){
    35         if(zz<=1)
    36         ans=max(ans,num[i]);
    37         else ans=max(ans,num[i]+1);
    38         if(i>=3&&s2[i]=='G'&&s2[i-1]=='S'&&s2[i-2]=='G'){
    39             if(zz>=3)
    40             ans=max(ans,num[i]+num[i-2]+1);
    41             else ans=max(ans,num[i]+num[i-2]);
    42         }
    43     }
    44     cout<<ans<<endl;
    45     return 0;
    46 }
    View Code
  • 相关阅读:
    自我介绍
    秋季学期总结
    第七周编程总结
    第六周作业
    第五周编程总结
    第四周编程总结
    第三周作业
    第二周作业
    抓老鼠啊~亏了还是赚了
    币值转换
  • 原文地址:https://www.cnblogs.com/ttttttttrx/p/10727702.html
Copyright © 2020-2023  润新知