P2697 宝石串
题目描述
有一种宝石串,由绿宝石和红宝石串成,仅当绿宝石和红宝石数目相同的时候,宝石串才最为稳定,不易断裂。安安想知道从给定的宝石串中,可以截取一段最长的稳定的宝石串,有多少颗宝石组成。请你帮助他。
绿宝石用‘G’表示,红宝石用‘R'表示。
输入输出格式
输入格式:
一行由G和R组成的字符串
输出格式:
最长的稳定的宝石串有多少颗宝石组成
输入输出样例
说明
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 }
正解思路:
把一种颜色的值定为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