藍橋杯 試題 歷屆試題 小朋友排隊 樹狀陣列

2022-06-25 02:30:14 字數 2205 閱讀 3497

問題描述

n 個小朋友站成一排。現在要把他們按身高從低到高的順序排列,但是每次只能交換位置相鄰的兩個小朋友。

每個小朋友都有乙個不高興的程度。開始的時候,所有小朋友的不高興程度都是0。

如果某個小朋友第一次被要求交換,則他的不高興程度增加1,如果第二次要求他交換,則他的不高興程度增加2(即不高興程度為3),依次類推。當要求某個小朋友第k次交換時,他的不高興程度增加k。

請問,要讓所有小朋友按從低到高排隊,他們的不高興程度之和最小是多少。

如果有兩個小朋友身高一樣,則他們誰站在誰前面是沒有關係的。

輸入格式

輸入的第一行包含乙個整數n,表示小朋友的個數。

第二行包含 n 個整數 h1 h2 … hn,分別表示每個小朋友的身高。

輸出格式

輸出一行,包含乙個整數,表示小朋友的不高興程度和的最小值。

樣例輸入

33 2 1

樣例輸出

9樣例說明

首先交換身高為3和2的小朋友,再交換身高為3和1的小朋友,再交換身高為2和1的小朋友,每個小朋友的不高興程度都是3,總和為9。

資料規模和約定

對於10%的資料, 1<=n<=10;

對於30%的資料, 1<=n<=1000;

對於50%的資料, 1<=n<=10000;

對於100%的資料,1<=n<=100000,0<=hi<=1000000。解題思路:

若兩個孩子身高為逆序對( ihj( hi:i位置孩子身高 ) ),則需要交換位置,雙方的不高興程度均+1。若直接用氣泡排序,時間複雜度為o( n^2 )。

可以選取bit(binary index tree 樹狀陣列)資料結構解決。

對於每個位置的孩子,其交換次數取決於左邊身高比他高的與右邊身高比他低的,兩次運用bit解決。

bit求逆序對:構建乙個值範圍是 1-max_h的bit,按 j = 0,1,...,n順序進行如下操作(其左邊比他高的)

對於每個j,(bit查詢到前hi項和)的個數是 ihj的個數。

對於bit求和和更新操作只需要o( logn ),迴圈n次最終解題的時間複雜度為o( nlogn )。

1 #include2 #include3

using

namespace

std;

45 typedef long

long

intll;67

const

int max_n = 100000;8

const ll max_h = 1000000;9

10//

輸入11

intn;

12int h[max_n]; //

身高 13

14int count[max_n]; //

不高興程度

15int bit[max_h+1]; //

bit 1-max_h

1617

int sum( int i ); //

計算 1-i的和

18void add( int i, int x ); //

更新 ai += x

19void

solve();

2021

intmain()

2228

29solve();

3031

return0;

32}3334

int sum( int

i )35

42return

s;43

} 44

45void add( int i, int

x )4652}

5354

void

solve()

5562

63//

右邊比其公升高低的

64 memset(bit,0,sizeof

(bit));

65for( int j=n-1; j>=0; j--)

6670

71 ll s = 0;72

for( int i=0; i)

7376 printf("

%lld\n

",s);

77 }

view code

/* 氣泡排序的時間複雜度為o( n^2 ),同時歸併等基於比較的排序時間複雜度只需要o( nlogn ),同樣在比較的同時記錄比較次數即可。 */

藍橋杯 歷屆試題 小朋友排隊

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

藍橋杯 歷屆試題 小朋友排隊

時間限制 1sec 記憶體限制 128mb 提交 75 解決 11 題目描述 n 個小朋友站成一排。現在要把他們按身高從低到高的順序排列,但是每次只能交換位置相鄰的兩個小朋友。每個小朋友都有乙個不高興的程度。開始的時候,所有小朋友的不高興程度都是0。如果某個小朋友第一次被要求交換,則他的不高興程度增...

藍橋 歷屆試題 小朋友排隊

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