zoukankan      html  css  js  c++  java
  • Codeforce219C-Color Stripe

    E. Color Stripe
    time limit per test
    2 seconds
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    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.

    Examples
    input
    Copy
    6 3
    ABBACC
    output
    Copy
    2
    ABCACA
    input
    Copy
    3 2
    BBB
    output
    Copy
    1
    BAB

    题意:给你一行n个元素,k种颜色,要求相邻的元素颜色不能相同,输出最少改变颜色的数量和n个元素最后的颜色(若有多种可能可任意输出一种)
    注意:k==2时必定是奇偶位不相同,要选一个最少改变方案,所以要知道奇位放A要改变的数多还是偶位放A要改变的数多,在训练时卡在这种情况了,
    其实一开始想到了ABBA这种情况,但当时的思路是只改变相同颜色的元素,没想到不同颜色元素也能改变,所以当时就假设如果有偶数个相同颜色的元素,其两边元素颜色必不同,结果就一直wrong answer on the test 15...
      1 #include<bits/stdc++.h>
      2 using namespace std;
      3 const int amn=5e5+5;
      4 char mp[amn];
      5 int a[amn],c[30];
      6 int main(){
      7     int n,k;
      8     ios::sync_with_stdio(0);
      9     cin>>n>>k;
     10     for(int i=1;i<=n;i++){
     11         cin>>mp[i];
     12         a[i]=mp[i]-'A'+1;
     13     }
     14     int ans=0,c1=0,c2=0;
     15     if(k==2){       ///k==2时必定是奇偶位不相同,要选一个最少改变方案,所以要知道奇位放A要改变的数多还是偶位放A要改变的数多
     16         for(int i=1;i<=n;i++){  /// 我们先假设奇位为A,偶位为B,因为有可能合法情况是偶位为A,奇数位为B,所以最后要比较哪个不合法的数量少,这样更改少的那个才能得到最少改变方案,故下面统计不合法数,
     17             if(i%2==0){     ///若偶位为A,则A的不合法数加1,否则B的不合法数加1
     18                 if(mp[i]=='A')c1++;
     19                 else c2++;
     20             }
     21             else{           ///若偶位为A,则B的不合法数加1,否则A的不合法数加1
     22                 if(mp[i]=='A')c2++;
     23                 else c1++;
     24             }
     25         }
     26         ans=min(c1,c2); ///选一个最小不合法数,得到最少改变方案
     27         for(int i=1;i<=n;i++){
     28             if(ans==c1){    ///若偶数位为A是不合法的,要将奇位变为A,偶位变为B
     29                 if(i%2) 
     30                     mp[i]='A';
     31                 else
     32                     mp[i]='B';
     33             }
     34             else{
     35                 if(i%2)     ///若奇数为位A是不合法的,要将偶数位变为A,奇数位变为B
     36                     mp[i]='B';
     37                 else
     38                     mp[i]='A';
     39             }
     40         }
     41     }
     42     else{
     43     a[n+1]=27;
     44     memset(c,0,sizeof c);
     45     bool f=0,d=0;
     46     int fr=1,ta=0,frc,mic,tac,it,cc;
     47     for(int i=2;i<=n;i++){
     48         if(a[i]==a[i-1]){
     49             d=1;
     50             if(fr>ta){
     51                 fr=i-1;
     52                 if(i-2>=1){
     53                     frc=a[fr-1];//cout<<frc<<'!'<<endl;
     54                     c[a[i]]=c[frc]=1;
     55                 }
     56                 else{
     57                     c[a[i]]=1;
     58                     f=1;
     59                 }
     60                 mic=a[i];
     61                 ta=i+1;
     62                 tac=a[ta];
     63                 c[tac]=1;
     64             }
     65             else{
     66 
     67                 ta=i+1;
     68                 tac=a[ta];
     69                 c[tac]=1;
     70             }
     71                 //printf("i:%d fr:%d ta:%d
    ",i,fr,ta);
     72                 if(!f&&i==n){
     73                     ans+=(ta-fr)/2;
     74                     it=fr+1;
     75                     cc=frc;
     76                     while(it<ta){
     77                         a[it]=cc;
     78                         mp[it]=a[it]-1+'A';
     79                         it+=2;
     80                     }
     81                     break;
     82                 }
     83 
     84         }
     85         else if(d){
     86             //printf("i:%d fr:%d ta:%d tac:%d
    ",i,fr,ta,tac);
     87             d=0;
     88             ans+=(ta-fr)/2;
     89             if(f){
     90                 cc=tac;
     91                 if(ta>n)
     92                     for(int i=1;i<=k;i++){
     93                         if(!c[i]){
     94                             cc=i;
     95                             break;
     96                         }
     97                     }
     98                 it=ta-2;
     99                 while(it>0){
    100                     a[it]=cc;
    101                     mp[it]=a[it]-1+'A';
    102                     it-=2;
    103                 }
    104                 f=0;
    105             }
    106             else{
    107                 cc=frc;
    108                 //printf("---
    i:%d frc: %d tac: %d
    ",i,frc,tac);
    109                 //for(int i=1;i<=26;i++)cout<<c[i]<<' ';
    110                 //cout<<"
    ---
    ";
    111                 if(frc==tac){
    112                     for(int i=1;i<=k;i++){
    113                         if(!c[i]){
    114                             cc=i;
    115                             break;
    116                         }
    117                     }
    118                 }
    119                 //cout<<i<<'?'<<cc<<endl;
    120                 memset(c,0,sizeof c);
    121                     it=fr+1;
    122                     while(it<ta){
    123                         a[it]=cc;
    124                         mp[it]=a[it]-1+'A';
    125                         it+=2;
    126                     }
    127             }
    128             fr=ta;
    129             ta--;
    130         }
    131     }
    132     if(f){
    133         ans+=(ta-fr)/2;
    134         for(int i=1;i<=k;i++){
    135                         if(!c[i]){
    136                             cc=i;
    137                             break;
    138             }
    139         }
    140         memset(c,0,sizeof c);
    141                     it=fr+1;
    142                     while(it<ta){
    143                         a[it]=cc;
    144                         mp[it]=a[it]-1+'A';
    145                         it+=2;
    146                     }
    147             fr=ta;
    148             ta--;
    149     }
    150     }
    151     cout<<ans<<endl;
    152     cout<<mp+1<<endl;
    153 }
     
  • 相关阅读:
    sql字符串函数(转)
    sqlserver 导入/导出Excel
    SelectSingleNode和SelectNodes区别
    iOS sqlite 的各种操作
    iOS 自定义的对象类型的解档和归档
    开放-封闭原则(OCP)开-闭原则 和 依赖倒转原则,单一职责原则
    iOS UITableView , UITableViewController ,UITableViewCell实现全国各省市遍历,选择相应的地区
    iOS 页面跳转传值,属性传值,代理传值,代码块传值,单例传值,通知传值
    iOS中的事件传递和响应者链条
    iOS开发 首次启动显示用户引导,第二次启动直接进入App,UIScrollView,UIPageControl,NSUserDefaults
  • 原文地址:https://www.cnblogs.com/Railgun000/p/11270244.html
Copyright © 2011-2022 走看看