Xiaoxiは大学に到着し、寮にゴキブリがたくさんいることを発見しました。ゴキブリは、赤と黒の2色でした。
彼は寮にゴキブリを一列に並べ、合計n人、Xiao Xiは色を変えさせたかった。各操作は次のいずれかです。1つ、1つのゴキブリを別の色に染める、2つ、2つのゴキブリの位置を入れ替える
Xiaoxiはコンピューターを持参しませんでした。少なくとも数回、色を変えてゴキブリの列を形成するために、計算を手伝ってくれるように頼みました
入力
整数最初の行 N- (1≤ N- ≤100 000)
2行目は長さnの文字列で 、赤の場合は文字「b」と「r」、黒の場合はbのみが含まれます。
出力
最小操作数を出力します
サンプル1
入力
3 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))== 0?true:false ; } 名前空間std を使用します。 typedefペア < int、int > 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 ; for(int 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; }