2023年第五屆藍橋杯C 省賽B組J題

2021-10-03 14:25:41 字數 1930 閱讀 3208

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

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

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

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

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

【資料格式】

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

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

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

例如,輸入:33

21程式應該輸出:

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。

典型樹狀陣列的運用~喵

暴力的話,n到1e4,要平方,就是1e8,可能就不行了。。

所以還是樹狀陣列把=-=

說好的今天寫樹形dp的。。呃。。。

先把這個題目寫完把=-=

這個地方c陣列維護的是小朋友身高的個數。

把小朋友的身高對應為c的下標。因為身高可以為0,最高可以達到1e6。。。(這些小朋友好厲害。。。),樹狀陣列一般不用0下標,所以身高普遍+1了。

所以getsum()獲取的是比當前小朋友身高矮的小朋友個數

我們需要計算乙個小朋友左邊比他高的小朋友個數,和右邊比他矮的小朋友個數。然後跟新當前小朋友的交換次數。最後等差數列求和可以得到這個小朋友的怒氣值。

最後維護一下ans就可以啦

計算乙個小朋友左邊比他高的。就是順序求即可。拿當前計數到多少個小朋友減去sum()值

計算乙個小朋友右邊比他矮的。就是逆序求。這個之前需要mst一下c陣列。計算比他矮的就可以了。注意存在身高一樣的小朋友

所以。。上**啦~

#include

#define mst(a, n) memset(a, n, sizeof(a))

#define lowbit(x) ((x) & -(x))

const

int n =

1e6+10;

using

namespace std;

typedef

long

long ll;

int n;

int h[n]

;int c[n]

;ll cnt[n]

;ll ans;

void

update

(int n,

int i,

int v)

}int

getsum

(int i)

return sum;

}int

main()

}for

(int i =

0; i < n; i++

)mst

(c,0);

for(

int i = n -

1; i >=

0; i--

)for

(int i =

0; i < n; i++

) cout << ans << endl;

return0;

}

2023年第五屆藍橋杯省賽C語言B組

1.啤酒和飲料 思路 有手就行 include using namespace std intmain 答案 11 2.切麵條 思路 自己畫一畫,前幾個是這樣的 對折次數 得到麵條數目 02 2 0 1 13 21 1 25 22 1 39 23 1 417 24 1 n2n 1 這個是找規律的 i...

史豐收速算 第五屆藍橋杯省賽

史豐收速演算法的革命性貢獻是 從高位算起,進製。不需要九九表,徹底顛覆了傳統手算 速算的核心基礎是 1位數乘以多位數的乘法。其中,乘以7是最複雜的,就以它為例。因為,1 7 是個迴圈小數 0.142857 如果多位數超過 142857 就要進1 同理,2 7,3 7,6 7 也都是類似的迴圈小數,多...

奇怪的分式 第五屆藍橋杯省賽

上小學的時候,小明經常自己發明新演算法。一次,老師出的題目是 1 4 乘以 8 5 小明居然把分子拼接在一起,分母拼接在一起,答案是 18 45 參見圖1.png 老師剛想批評他,轉念一想,這個答案湊巧也對啊,真是見鬼!對於分子 分母都是 1 9 中的一位數的情況,還有哪些算式可以這樣計算呢?請寫出...