zoukankan      html  css  js  c++  java
  • Codeforce219C——贪心——Color Stripe

    A colored stripe is represented by a horizontal row of n square cells, each cell is pained one of k colors. Your task is to repaint the minimum number of cells so that no two neighbouring cells are of the same color. You can use any color from 1 to k to repaint the cells.

    Input

    The first input line contains two integers n and k (1 ≤ n ≤ 5·105; 2 ≤ k ≤ 26). The second line contains n uppercase English letters. Letter "A" stands for the first color, letter "B" stands for the second color and so on. The first k English letters may be used. Each letter represents the color of the corresponding cell of the stripe.

    Output

    Print a single integer — the required minimum number of repaintings. In the second line print any possible variant of the repainted stripe.

    Sample test(s)
    input
    6 3
    ABBACC
    output
    2
    ABCACA
    input
    3 2
    BBB
    output
    1
    BAB
    /*
    对m == 2 的情况特殊处理  假顶A出现在奇数项,B出现在奇数项,比较出现的次数,如果A出现次数少于B,那么该A,反之改B
    对于 m > 2 的情况 正常处理
    */
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    const int MAX = 500000 + 10;
    int main()
    {
        int n, m;
        char s[MAX];
        while(~scanf("%d%d", &n, &m)){
            scanf("%s", s);
            int len = strlen(s);
            char ch;
            int ans = 0;
            if(m == 2){
               int c1 = 0, c2 = 0;
               for(int i = 0 ; i < len; i++){
                       if(i % 2 == 1) {
                               if(s[i] == 'A') c1++;
                               else c2++;
                       }
                       else {
                               if(s[i] == 'A') c2++;
                               else c1++;
                       }
               }
                       int ans = min(c1, c2);
                       for(int i = 0; i < len; i++){
                               if(ans == c1){
                                    if(i % 2 == 1){
                                            s[i] = 'B';
                                    }
                                    else s[i] = 'A';
                               }
                               else {
                                    if(i % 2 == 1){
                                            s[i] = 'A';
                                    }
                                    else s[i] = 'B';
                               }
                       }
                       printf("%d
    ", ans);
                       printf("%s
    ",s);
            }
            else {
            for(int i = 1 ; i < len; i++){
                    if(s[i-1] == s[i]){
                            ans++;
                            for(int j = 1; j <= m ;j++){
                                    ch = 'A' + j - 1;
                                    if(s[i] == ch || s[i+1] == ch);
                                    else {
                                                    s[i] = ch;
                                                    break;
                                            }
                                    }
                            }
                    }
            printf("%d
    %s
    ", ans, s);
            }
        }
        return 0;
    }
                     
    

      

  • 相关阅读:
    uniapp项目笔记
    JS的基本数据类型symbol
    javascript中的offsetWidth、clientWidth、innerWidth及相关属性方法
    const, let, var的区别
    vue中的computed属性
    微星主板多个硬盘启动顺序
    vue中子父组件传值问题
    Vue 中 ref 的使用
    码云ssh免密码登录
    当在iOS下获取scrollTop时可以获取到,在Android下获取scrollTop一直为0的问题
  • 原文地址:https://www.cnblogs.com/zero-begin/p/4662729.html
Copyright © 2011-2022 走看看