小朋友排隊問題 藍橋杯

2021-09-19 22:51:15 字數 1233 閱讀 9252

解題過程:每個小朋友交換次數是前面比他大的個數與後面比他小的個數之和,主要思路是對陣列歸併兩次,分別從左往右、然後再從右往左進行歸併

1.要使用結構體記錄原始資料的位置

2.要開兩個陣列各歸併一遍,如果只開乙個第一次歸併不引用結果會出錯

3.最終結果要開long long,不然結果會爆

4.最終結果要乘以 1ll(1的長整型),不然也會出錯

#include

#include

#include

#include

using namespace std;

struct node

;int cnt[

100005];

void

merge_sort1

(vector

&vc,

int l,

int r)

} t=0;

for(

int k = l;k

) vc[k]

= n[t++];

delete [

]n;}

void

merge_sort2

(vector

&vc,

int l,

int r)

} t=0;

for(

int i=l;i

) vc[i]

= n[t++];

delete [

]n;}

intmain()

vector

uc(vc.

begin()

,vc.

end())

;merge_sort1

(vc,

0,vc.

size()

);merge_sort2

(uc,

0,uc.

size()

);long

long sum =0;

for(

int i=

0;isize()

;i++

) sum +

=1ll*(

1+cnt[i]

)*cnt[i]/2

; cout << sum;

return0;

}

小朋友排隊 藍橋杯

因此我們可以借助樹狀陣列來求解前面比它大的個數,即逆序對 求後面比它小的個數的時候我們可以倒著插入,直接統計即可 因為有的資料為0,所以我們需要將所有插入的資料 1 另外統計的時候要處理相同的數,統計前面的數的時候不用減1,統計後面的數的時候需要減1 這樣處理的原因自己思考一下便出來了 includ...

藍橋杯 小朋友排隊

歷屆試題 小朋友排隊 時間限制 1.0s 記憶體限制 256.0mb 問題描述 n 個小朋友站成一排。現在要把他們按身高從低到高的順序排列,但是每次只能交換位置相鄰的兩個小朋友。每個小朋友都有乙個不高興的程度。開始的時候,所有小朋友的不高興程度都是0。如果某個小朋友第一次被要求交換,則他的不高興程度...

小朋友排隊 藍橋杯

問題描述 n 個小朋友站成一排。現在要把他們按身高從低到高的順序排列,但是每次只能交換位置相鄰的兩個小朋友。每個小朋友都有乙個不高興的程度。開始的時候,所有小朋友的不高興程度都是0。如果某個小朋友第一次被要求交換,則他的不高興程度增加1,如果第二次要求他交換,則他的不高興程度增加2 即不高興程度為3...