P2697 宝石串

题目描述

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

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

输入输出格式

输入格式:

 

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

 

输出格式:

 

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

 

输入输出样例

输入样例#1: 复制
GRGGRG
输出样例#1: 复制
4

说明

RGGR为答案。

宝石数<=1000000

 

 

这个题,刚开始胡乱写,

输出g和r出现次数较少的次数再除以2,

就能拿70分哦!

amazing~

 

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<cstring>
 6 using namespace std;
 7 
 8 char c[1000002]; 
 9 int a,b;
10 
11 int main()
12 {
13     cin>>c;
14     int l=strlen(c);
15     for(int i=0;i<l;++i)
16     {
17         if(c[i]=='G') a++;
18         else b++;
19     }
20     int c=min(a,b);
21     printf("%d",c*2);
22     return 0;
23 }
70分乱搞代码

 

 

正解思路:

把一种颜色的值定为1,另一种定为-1,用f数组记录前缀和,当出现两个相同的前缀和时,就证明找到了一组两种宝石相等的策略,我们就更新maxn数组进行比较。break的作用很大,不可或缺,虽然这个题好像没问题,但是自己手打的坑点就会严重超时。

 

ac代码:

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<cstring>
 6 using namespace std;
 7 
 8 char c[1000002]; 
 9 int f[1000002],n,tot,sum,maxn;
10 
11 int main()
12 {
13     cin>>c;
14     int l=strlen(c);
15     for(int i=0;i<l;++i)
16     {
17         if(c[i]=='G') 
18             f[i+1]=f[i]+1;
19         else f[i+1]=f[i]-1;
20     }
21     for(int i=0;i<=l/2;++i)
22     {
23         for(int j=l;j>=i;--j)
24         {
25             if(f[j]-f[i]==0)
26             {
27                 maxn=max(maxn,j-i);
28                 break;
29             }
30         }        
31     }
32     printf("%d",maxn);
33     return 0;
34 } 

 


如果你不开心,那我就把右边这个帅傻子分享给你吧,
你看,他这么好看,跟个zz一样看着你,你还伤心吗?
真的!这照片盯上他五秒钟就想笑了。
一切都会过去的。
时间时间会给你答案2333
posted @ 2018-07-12 21:45  孟东行#  阅读(456)  评论(0编辑  收藏  举报