調整隊形(某客某易模擬題)

2021-07-30 08:48:37 字數 1340 閱讀 1802

在幼兒園有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 表示。小朋友們都很頑皮,當乙個男生挨著的是女生的時候就會發生矛盾。作為幼兒園的老師,你需要讓男生挨著女生或者女生挨著男生的情況最少。你只能在原隊形上進行調整,每次...