n 個小朋友站成一排。現在要把他們按身高從低到高的順序排列,但是每次只能交換位置相鄰的兩個小朋友。
每個小朋友都有乙個不高興的程度。開始的時候,所有小朋友的不高興程度都是0。
如果某個小朋友第一次被要求交換,則他的不高興程度增加1,如果第二次要求他交換,則他的不高興程度增加2(即不高興程度為3),依次類推。當要求某個小朋友第k次交換時,他的不高興程度增加k。
請問,要讓所有小朋友按從低到高排隊,他們的不高興程度之和最小是多少。
如果有兩個小朋友身高一樣,則他們誰站在誰前面是沒有關係的。
輸入的第一行包含乙個整數n,表示小朋友的個數。
第二行包含 n 個整數 h1 h2 … hn,分別表示每個小朋友的身高。
輸出一行,包含乙個整數,表示小朋友的不高興程度和的最小值。
3
3 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。
#include
#define i scanf
#define ol puts
#define o printf
#define f(a,b,c) for(a=b;a#define ff(a,b) for(a=0;a#define fg(a,b) for(a=b-1;a>=0;a--)
#define len 100010
#define max 0x06ffffff
#define v vector
#define ll long long
using namespace std;
typedef struct nodenode;
int n;
node arr[len];
node tmp[len];
int ans=0;
void merge(int l,int mid,int r)else
}//處理未迴圈完畢的部分
while(b<=r) tmp[i++]=arr[b++];
b--;
while(a<=mid)
//將臨時陣列的資料放到工作陣列中
for(i=l;i<=r;i++) arr[i]=tmp[i-l];
}void mergesort(int l,int r)
}int main()
mergesort(0,n-1);
ll ans=0;
ff(i,n)
o("%lld",ans);
return
0;}
小朋友排隊 藍橋杯
因此我們可以借助樹狀陣列來求解前面比它大的個數,即逆序對 求後面比它小的個數的時候我們可以倒著插入,直接統計即可 因為有的資料為0,所以我們需要將所有插入的資料 1 另外統計的時候要處理相同的數,統計前面的數的時候不用減1,統計後面的數的時候需要減1 這樣處理的原因自己思考一下便出來了 includ...
藍橋杯 小朋友排隊
歷屆試題 小朋友排隊 時間限制 1.0s 記憶體限制 256.0mb 問題描述 n 個小朋友站成一排。現在要把他們按身高從低到高的順序排列,但是每次只能交換位置相鄰的兩個小朋友。每個小朋友都有乙個不高興的程度。開始的時候,所有小朋友的不高興程度都是0。如果某個小朋友第一次被要求交換,則他的不高興程度...
小朋友排隊 藍橋杯
問題描述 n 個小朋友站成一排。現在要把他們按身高從低到高的順序排列,但是每次只能交換位置相鄰的兩個小朋友。每個小朋友都有乙個不高興的程度。開始的時候,所有小朋友的不高興程度都是0。如果某個小朋友第一次被要求交換,則他的不高興程度增加1,如果第二次要求他交換,則他的不高興程度增加2 即不高興程度為3...