rainbow与freda染旗

 rainbow与freda染旗

★   输入文件: shimi.in   输出文件: shimi.out    简单对比
时间限制:1 s   内存限制:128 MB

【题目背景】

Freda:aya Rainbow,怎么没看见你城堡挂旗子呀?
Rainbow:我城堡旗子太难看了肿么办T_T
Freda:lala~那好办,我可以帮你染色呀~
Rainbow:嗯嗯,那就试试吧~ 

【题目描述】

Rainbow城堡的旗子是一个有N个基本单位的长条>_<,每个单位都会被染成前m个大写字母当中的一个颜色。可是,Rainbow认为,两个相邻的单位有相同的颜色很难看的说。所以,Rainbow需要改动一些单位的颜色,使得不存在两个相邻的单位颜色相同。当然了,那些被改动的单位改动之后的颜色也是前m个大写字母当中的一个。Rainbow想请你帮忙计算,它最少要改动多少个单位的颜色才能让旗子好看呢?

【输入格式】

第一行两个整数N、m,表示旗子组成的基本单位数目和颜色的范围。
接下来一行一个长度为N的字符串,字符串的每个字符都是在前m个大写字母的范围内的,表示Rainbow的旗帜。

【输出格式】

 一行一个整数表示Rainbow最少改动的单位数目。

【样例输入】

6 3
ABBACC

【样例输出】

2
//某大神说用DP,是出题人的失误导致这个题的正解成了模拟
/****
思路:
首先,考虑只有两种颜色的情况,只能是A和B交替组合,我们只需要将ABABAB...AB或BABAB...ABA与原来的进行比较,看看哪个相符程度高,
然后再求出改变的最少的位置数;
其次,考虑三种及三种以上颜色的情况,一面旗子至多有两个邻居,也就是说使用三种颜色完全可以使所有旗子与相邻的不同色。
如果出现两面相邻的旗子同色,我们只需要改后面的那一面旗子,计数,并将旗子进行标记。
如果不标记,当出现AAABCB...这种情况时,答案就会有错误,模拟时,会将第二面和第三面都改变。
****/
#include <stdio.h>

int main()
{
    freopen("shimi.in","r",stdin);
    freopen("shimi.out","w",stdout);
    int n,m;
    int i,j,k;
    char c[100010]={'\0'};
    scanf("%d%d",&n,&m);
    scanf("%s",c);
    if(m==2)
    {
        char temp='A';
        int d=0;
        int s1=0,s2=0;
        for(i=0;i<n;i++)
        {
            if(c[i]!=temp)
                s1++;
            if(d)
                temp='A';
            else
                temp='B';
            d=1-d;
            //printf("%c",temp);
        }
        temp='B';
        d=1;
        for(i=0;i<n;i++)
        {
            if(c[i]!=temp)
                s2++;
            if(d)
                temp='A';
            else
                temp='B';
            d=1-d;
            //printf("%c",temp);
        }
        printf("%d\n",s1<s2?s1:s2);
    }
    else
    {
        int s=0;
        for(i=1;i<n;i++)
        {
            if(c[i]==c[i-1])
            {
                s++;
                c[i]='-1';
            }
        }
        printf("%d\n",s);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值