题意:给你n,k,大意就是说给你一个已经涂满颜色长为n的字符串,现有k种颜色可以选择,问你最少要改变多少个箱子的颜色使得相邻箱子之间颜色不同。

解题思路:当k = 2 时单独讨论,不能用贪心,其余情况都可贪心得到。

解题代码:

  1 // File Name: 219c.cpp
  2 // Author: darkdream
  3 // Created Time: 2014年07月26日 星期六 15时45分56秒
  4 
  5 #include<vector>
  6 #include<list>
  7 #include<map>
  8 #include<set>
  9 #include<deque>
 10 #include<stack>
 11 #include<bitset>
 12 #include<algorithm>
 13 #include<functional>
 14 #include<numeric>
 15 #include<utility>
 16 #include<sstream>
 17 #include<iostream>
 18 #include<iomanip>
 19 #include<cstdio>
 20 #include<cmath>
 21 #include<cstdlib>
 22 #include<cstring>
 23 #include<ctime>
 24 
 25 using namespace std;
 26 char str[1000000];
 27 int main(){
 28     int n , k ; 
 29     scanf("%d %d",&n,&k);
 30     scanf("%s",str);
 31     int len = strlen(str);
 32     int sum  = 0 ;
 33     if(k == 2)
 34     {
 35        int tempa,tempb;;
 36        tempa = tempb = 0 ; 
 37        for(int i = 0 ;i < len ;i ++)
 38        {
 39           if(i %2 == 0)
 40           {
 41               if(str[i] == 'A')
 42                   tempa ++;
 43               else tempb ++;
 44           }else {
 45              if(str[i] == 'B')
 46                  tempa ++ ;
 47              else tempb ++ ;
 48           }
 49        }
 50        if(tempa < tempb)
 51        {
 52           printf("%d\n",tempa);
 53           for(int i = 0 ;i < len ;i ++)
 54           {
 55             if(i % 2 == 0 )
 56                 printf("B");
 57             else printf("A");
 58           }
 59        }else{
 60           printf("%d\n",tempb);
 61           for(int i = 0 ;i < len ;i ++)
 62           {
 63             if(i % 2 == 0 )
 64                 printf("A");
 65             else printf("B");
 66           }
 67        
 68        }
 69        return 0 ; 
 70     }
 71     for(int i = 1 ;i < len ;i ++)
 72     {
 73        if(str[i] == str[i-1])
 74        {
 75            int ok = 0 ; 
 76            for(int j = 0 ;j < k ;j ++)
 77            {
 78               char t = j + 'A';
 79               if(t != str[i-1] && t != str[i+1] )
 80               {
 81                  str[i] = t ;
 82                  ok = 1; 
 83                  break;
 84               }
 85            }
 86            if(ok == 0 )
 87            for(int j = 0 ;j < k ;j ++)
 88            {
 89              char t = j +'A';
 90              if(t != str[i-1])
 91              {
 92                str[i] = t; 
 93                break;
 94              }
 95            }
 96            sum ++ ; 
 97        }
 98     }
 99     printf("%d\n",sum);
100     puts(str);
101 return 0;
102 }
View Code

 

posted on 2014-07-26 16:35  dark_dream  阅读(206)  评论(0编辑  收藏  举报