zoukankan      html  css  js  c++  java
  • 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人

    #include<iostream>
    #include<algorithm>
    using namespace std;
    int main(){
        ios::sync_with_stdio(0);cin.tie(0);
        int T,t,N,m,i,gp[110],ans;
        string s;
        cin>>T;
        for(t=1;t<=T;t++){
            cin>>N>>s;
            s=" "+s;//下标移位
            ans=m=0;
            for(i=1;i<=N;i++)
                if(s[i]==s[i-1])
                    gp[m]++;
                else
                    gp[++m]=1;
            if(s[1]==s[N]&&N!=1)
                if(m!=1){
                    gp[1]+=gp[m];
                    m--;
                }
                else
                    gp[1]++;
            for(i=1;i<=m;i++)
                ans+=gp[i]/2;
            cout<<"Case #"<<t<<":
    "<<ans<<'
    ';
        }
        
        return 0;
    }
  • 相关阅读:
    (16)C#继承
    (3)新概念英语一(11-20)lessons
    (15)C#集合
    (14)编码
    (2)新概念英语一(1-10)lessons
    (13)C#数组和元组
    Uva 11729 Commando War
    Uva 11292 Dragon of Loowater
    谈谈单元最短路
    [USACO 3.3.1]骑马修栅栏t
  • 原文地址:https://www.cnblogs.com/stelayuri/p/12235308.html
Copyright © 2011-2022 走看看