1. 程式人生 > >名企筆試:網易遊戲2017招聘筆試題(調整隊形)

名企筆試:網易遊戲2017招聘筆試題(調整隊形)

網易遊戲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; }