在幼兒園有n個小朋友排列為乙個隊伍,從左到右乙個挨著乙個編號為(0~n-1)。其中有一些是男生,有一些是女生,男生用』b』表示,女生用』g』表示。小朋友們都很頑皮,當乙個男生挨著的是女生的時候就會發生矛盾。作為幼兒園的老師,你需要讓男生挨著女生或者女生挨著男生的情況最少。你只能在原隊形上進行調整,每次調整只能讓相鄰的兩個小朋友交換位置,現在需要盡快完成隊伍調整,你需要計算出最少需要調整多少次可以讓上述情況最少。例如:
ggbbg -> ggbgb -> gggbb
這樣就使之前的兩處男女相鄰變為一處相鄰,需要調整隊形2次
輸入描述:
輸入資料報括乙個長度為n且只包含g和b的字串.n不超過50.
輸出描述:
輸出乙個整數,表示最少需要的調整隊伍的次數
輸入例子:
ggbbg
輸出例子:
2上述問題,需要移動,使得男孩和女孩相鄰最少,也就是分成兩堆,男孩一堆,女孩一堆,只有乙個相鄰,這樣矛盾點只有1。
因為是排隊,就有兩種:女孩在前or男孩在前,分別計算取最小。
女孩在前時,需要考慮將女孩移動到前面需要的步數,換句話說是統計該女孩前面有幾個男孩,前面男孩的個數即為女孩需要移動的步數。
#include
#include //使用c++的string,需要引入該標頭檔案
#define nmax 50
using
namespace
std;
int main()
; int mark_gb[nmax] = ;
int cur_pos_bg = 0;
int cur_pos_gb = 0;
cin >> str;
for(int i=0;i//b在前,g在後
if(str.at(i)=='g')
//g在前,b在後
if(str.at(i)=='b')
mark_bg[i] = cur_pos_bg;
mark_gb[i] = cur_pos_gb;
}for(int i=0;i//b在前,g在後
if(str.at(i)=='b')
step1 += mark_bg[i];
//g在前,b在後
if(str.at(i)=='g')
step2 += mark_gb[i];
}cout
<< min(step1,step2) << endl;
return
0;}
恭喜你,通過了所有測試用例! 演算法調整隊形
來自 2017 年網易春招筆試題三 在幼兒園有 n個小朋友排列為乙個隊伍,從左到右乙個挨著乙個編號為 0 n 1 其中有一些是男生,有一些是女生,男生用 b 表示,女生用 g 表示。小朋友們都很頑皮,當乙個男生挨著的是女生的時候就會發生矛盾。作為幼兒園的老師,你需要讓男生挨著女生或者女生挨著男生的情...
調整隊形 TJOI2007
給定乙個初始的序列以及四種操作,問最少操作多少次可以是序列變為回文序列。操作如下 在隊伍左側或右側新增乙個數 在隊伍中插入乙個數 刪除乙個數 改變乙個數的值 看到給定的序列和改數的操作 其實還是因為詢問是最少操作次數 可以想到區間dp。設子狀態 dp i j 表示將區間 i,j 變為回文序列的最少操...
網易面試題 調整隊形
在幼兒園有n個小朋友排列為乙個隊伍,從左到右乙個挨著乙個編號為 0 n 1 其中有一些是男生,有一些是女生,男生用 b 表示,女生用 g 表示。小朋友們都很頑皮,當乙個男生挨著的是女生的時候就會發生矛盾。作為幼兒園的老師,你需要讓男生挨著女生或者女生挨著男生的情況最少。你只能在原隊形上進行調整,每次...