名企筆試:網易遊戲2017招聘筆試題(調整隊形)
阿新 • • 發佈:2018-12-23
網易遊戲2017招聘筆試題(調整隊形)
題意:
在幼兒園有n個小朋友排列為一個隊伍,從左到右一個挨著一個編號為(0~n-1)。其中有一些是男生,有一些是女生,男生用’B’表示,女生用’G’表示。小朋友們都很頑皮,當一個男生挨著的是女生的時候就會發生矛盾。作為幼兒園的老師,你需要讓男生挨著女生或者女生挨著男生的情況最少。你只能在原隊形上進行調整,每次調整隻能讓相鄰的兩個小朋友交換位置,現在需要儘快完成隊伍調整,你需要計算出最少需要調整多少次可以讓上述情況最少。例如
GGBBG -> GGBGB -> GGGBB
這樣就使之前的兩處男女相鄰變為一處相鄰,需要調整隊形2次
輸入描述:
輸入資料包括一個長度為n且只包含G和B的字串.n不超過50.
輸出描述:
輸出一個整數,表示最少需要的調整隊伍的次數
輸入例子:
GGBBG
輸出例子:
2
分析:
題目的意思很簡單,就是左右兩邊男女分開,條件是:每次只能交換相鄰的兩個不同性別的小朋友。從哪個角度思考這個問題?在原佇列上調整隊形,是不是就是一種排序呢? 每次調整隻能讓相鄰的兩個小朋友交換位置,有沒有可能是交換排序,或者是插入排序(將一個數找到它的確定位置)?我們首先假設調整結束後所有的女孩都在左邊,所有的男孩都在右邊,現在就是每次交換相鄰的男女使其到目標位置。(當然男孩在左邊,女孩在右邊也是同理的)最後只需要比較哪種方式操作的次數少即可。
Code:
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<set>
#include<map>
#include<vector>
#include<string>
using namespace std;
typedef long long LL;
const int MAXN = 1005;
int main()
{
string s;
while(cin >>s){
//所有的G在左邊,B在後邊,對於任何一個G,我們不用就行交換
//只需要紀錄在其前面有幾個B,就需要交換多少次
int ans = s.size()*s.size();
int sum = 0, countb = 0;
for(int i=0;i<s.size();i++){
if(s[i] == 'B') countb ++;
if(s[i] == 'G') sum += countb;
}
ans = sum;
sum = 0 ;
//所有的B在左邊,G在後邊,對於任何一個B,我們不用就行交換
//只需要紀錄在其前面有幾個G,就需要交換多少次
int countg = 0;
for(int i=0;i<s.size();i++){
if(s[i] == 'G') countg ++;
if(s[i] == 'B') sum += countg;
}
ans = min(ans,sum);
cout<<ans<<endl;
}
return 0;
}