ZJNU 1531 - 丢手绢--中级
Posted stelayuri
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZJNU 1531 - 丢手绢--中级相关的知识,希望对你有一定的参考价值。
可以将相同的人数分块存在数组gp中先
例如RRGGGRBBBBRR
则gp[1~5]={2,3,1,4,2}
首先可以知道,如果要让没有相邻的相同,只需要每个gp[i]/2向下取整即可得出最少需要改变的个数
例如RGGGR,只看G,只需要改变中间的G即可
例如RGGGGR,只看G,可以选择改变1和3或者2和4位置的G、
最后,考虑首尾成环对答案的影响
例如RRRGRRR
gp[1~3]={3,1,3}
则由上面的说法可以得到答案为3/2+1/2+3/2=1+0+1=2人
但实际上首尾连接后有6个R坐在一起
至少需要改变3个人才能满足题意
另,如果所有人都同色
例如RRRRR
根据上面说法只需要改变5/2=2人
即改变2和4位置的人
但是这样1和5首尾相连后会导致同色的人坐在一起
这种情况下答案需要特判为(5+1)/2=3人
1 /* 2 Written By StelaYuri 3 */ 4 #include<iostream> 5 #include<algorithm> 6 using namespace std; 7 int main(){ 8 ios::sync_with_stdio(0);cin.tie(0); 9 int T,t,N,m,i,gp[110],ans; 10 string s; 11 cin>>T; 12 for(t=1;t<=T;t++){ 13 cin>>N>>s; 14 s=" "+s;//下标移位 15 ans=m=0; 16 for(i=1;i<=N;i++) 17 if(s[i]==s[i-1]) 18 gp[m]++; 19 else 20 gp[++m]=1; 21 if(s[1]==s[N]&&N!=1) 22 if(m!=1){ 23 gp[1]+=gp[m]; 24 m--; 25 } 26 else 27 gp[1]++; 28 for(i=1;i<=m;i++) 29 ans+=gp[i]/2; 30 cout<<"Case #"<<t<<": "<<ans<<‘ ‘; 31 } 32 33 return 0; 34 }
以上是关于ZJNU 1531 - 丢手绢--中级的主要内容,如果未能解决你的问题,请参考以下文章