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 中的一位數的情況,還有哪些算式可以這樣計算呢?請寫出...