藍橋 歷屆試題 小朋友排隊

2021-09-13 03:39:49 字數 1347 閱讀 9073

問題描述:傳送門

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

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

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

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

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

輸入格式

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

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

輸出格式

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

樣例輸入

33 2 1

樣例輸出

樣例說明

首先交換身高為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。

真坑,我還以為我樹狀陣列不用複習了的。

首先說下我踩了的坑點:

1:看題第一反應逆序對,求次數,沒想到(不會)還要反著求後面的順序對(後面交換對前面的影響)。

3:在getsum的時候,是會把本身給算進去的,在求逆序對的時候,用i-getsum(i),會把本身給減去,所以逆序對減去就是前面比i小的個數,但是在求順序對的時候,直接+getsum(i)會把本身也給加上,所以是+getsum(i-1)。

4:說出來可能不信,這題身高還有0的,我就一直報超時,0&(-0),這是什麼啊,然後就一直死迴圈了,所以在要在所有原先輸入的值上都+1(很多題都是這種情況,我也不是第一次見了,可是寫的時候就是沒考慮到)。

**:

#includeusing namespace std;

const int maxn = 1000005;

int a[maxn],c[maxn];

long long ans[maxn];

int n;

int lowbit(int x)

void updata(int a,int k)

long long sum=0;

for(int i=0;iprintf("%lld\n",sum);

}int main()

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

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

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

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

歷屆試題 小朋友排隊

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