CodeForces 719Bアナトリーとゴキブリ(思考演習+貪欲)

Xiaoxiは大学に到着し、寮にゴキブリがたくさんいることを発見しました。ゴキブリは、赤と黒の2色でした。

彼は寮にゴキブリを一列に並べ、合計n人、Xiao Xiは色を変えさせたかった。各操作は次のいずれかです。1つ、1つのゴキブリを別の色に染める、2つ、2つのゴキブリの位置を入れ替える

Xiaoxiはコンピューターを持参しませんでした。少なくとも数回、色を変えてゴキブリの列を形成するために、計算を手伝ってくれるように頼みました

入力

整数最初の行  N-  (1≤  N-  ≤100 000) 

2行目は長さnの文字列で  、赤の場合は文字「b」と「r」、黒の場合はbのみが含まれます。

出力

最小操作数を出力します

サンプル1

入力


RBR

出力

0

 

サンプル2

入力

5 
rbbrr

出力

1

 

サンプル3

入力

5 
bbbbb

出力

2

 

ヒント

例1では、3番目と4番目のゴキブリを交換することができ、合計1回の操作が必要です。

例2では、​​2番目と4番目のゴキブリが赤く染まりました。

例3、操作は必要ありません。オペランドが0の質問カードは1時間書き込まれ

いません(多すぎます)

 

ワシントン州の考え:ゴキブリの2つの色を隣の色の数と一致させる方法を考え始めてから、転置しました。その結果、転置の仕方がわからず、何が書かれているのかわかりませんでした。

ACアイデア:隣接するものは異なる色である必要があるため、奇数ビットと偶数ビットの方法に従って考えることができます

①すべての奇数ビットが「r」で、すべての偶数ビットが「b」であると仮定します。このとき、奇数ビットr数はx1です。偶数ビットの数bはx2です
。②すべての奇数ビットを「b」、すべての偶数ビットを「r」と仮定します。このとき、奇数ビットの数bはx3です。偶数ビットの数rはx4で

あり、数r奇数ビットまたは偶数ビット数rこと、およびb共感判断することができる

、我々はR bをさせようにし、操作の最小数の被験体に、又は合理的位置に配置され
、すなわちMAX(X1 、x4)、
    奇数ビットが「r」で偶数ビットが「b」の場合の修飾された最大(x2、x3)の最大数を意味します。これは、奇数ビットが「r」で偶数ビットが「b」の場合を意味します要件
満たす最大数の場合、合理的な位置に配置するためにbまたはrを選択する必要があります。
他の場合は、すべてが隣接するときの最小操作数がmin(max(x1、x4)、max( x2、x3))

コード:

#include <iostream> 
#include <algorithm> 
#include < string .h> 
#include <cstdio> 
#include < string > 
#include <cmath> 
#include <vector> 
#include <stack> 
#include <queue> 
#include < stack> 
#include <list> 
#include <map> 
#include < set >
 // #include <unordered_map> 
#define Fbo friend bool operator <(node a、node b)
 #define mem(a、b)memset(a、 b、
sizeof(a)) #defineFOR(a、b、c)for(int a = b; a <= c; a ++)
 #define RFOR(a、b、c)for(int a = b; a> = c; a--)
 #defineオフios :: sync_with_stdio(0)
 #define sc(a)scanf( "%lld"、&a)
 #define pr(a)printf( "%d \ n"、a);
#define SC(n、m)scanf( "%d%d"、&n、&m)
 bool check1(int a){ return(a&(a- 1))== 0truefalse ; }

 名前空間std を使用します
typedefペア < intint > pii;
typedef long  long ll;
const  int INF = 0x3f3f3f3f ; // 1e10 
const  int mod = 1e9 + 7 ;
const  int Maxn = 1e5 + 5 ;
const  int M = Maxn * 20 ;
const  double pi = acos(-1.0 );
const  double eps = 1e- 8 ;

char s [最大];
int n;

int main(){
     int xr = 0、xb = 0、yr = 0、yb = 0 ;
    cin >> n >> s + 1 ;
    forint i = 1 ; i <= n; i ++ ){
         if(i&1 ){
             if(s [i] == ' r ' 
                xr ++ ;
            それ以外は
                xb ++ ;
        }
        else {
             if(s [i] == ' r '  ++ ;
            それ以外の場合
                yb ++ ;
        }
    }
    // cout << "r:" << xr << "" << "b:" << xb << endl;
    // cout << "odd r:" << yr << "" << "odd b:" << yb << endl; 
    int ans = min(max(xr、yb)、max(xb、yr));
    cout << ans << endl;
}

 

おすすめ

転載: www.cnblogs.com/AlexLINS/p/12702593.html