要想整體的不高興度最小,就需要交換的次數越少越好,那麼怎樣才可以得到最少的交換次數呢?
題目中要求只能交換相鄰兩個數,因此很容易想到氣泡排序,假設原序列有k個逆序對,要交換相鄰的兩個元素最多會使逆序對減少1,因此最少需要k次交換,而氣泡排序的每一次交換都會使逆序對減少1,因此使用氣泡排序就可以得到最少的交換次數
再想怎麼得到乙個總體不高興度的最小值呢?
給定乙個序列:3 2 5 7 1
對於2這個數首先必然要把它前面所有比它大的數全部交換到它後面去(假設a次),然後必然要將它後面所有比它小的數交換到它後面去(假設b次),對於總體都這樣做,就說明再排序過程中沒有進行一次多餘從操作,這樣就可以得到總體不高興度的最小值
#include
using
namespace std;
typedef
long
long ll;
const
int n=
1e6+10;
int n;
int a[n]
;int tr[n]
;int temp[n]
;int
lowbit
(int x)
intsum
(int x)
void
add(
int x)
intmain()
memset
(tr,0,
sizeof
(tr));
for(
int i=n;i;i--
) ll res=0;
for(
int i=
1;i<=n;i++
) res+
=(ll)(1
+temp[i]
)*temp[i]/2
; cout<
return0;
}
小朋友排隊
n 個小朋友站成一排。現在要把他們按身高從低到高的順序排列,但是每次只能交換位置相鄰的兩個小朋友。每個小朋友都有乙個不高興的程度。開始的時候,所有小朋友的不高興程度都是0。如果某個小朋友第一次被要求交換,則他的不高興程度增加1,如果第二次要求他交換,則他的不高興程度增加2 即不高興程度為3 依次類推...
小朋友排隊
問題描述 n 個小朋友站成一排。現在要把他們按身高從低到高的順序排列,但是每次只能交換位置相鄰的兩個小朋友。每個小朋友都有乙個不高興的程度。開始的時候,所有小朋友的不高興程度都是0。如果某個小朋友第一次被要求交換,則他的不高興程度增加1,如果第二次要求他交換,則他的不高興程度增加2 即不高興程度為3...
小朋友排隊
n 個小朋友站成一排。現在要把他們按身高從低到高的順序排列,但是每次只能交換位置相鄰的兩個小朋友。每個小朋友都有乙個不高興的程度。開始的時候,所有小朋友的不高興程度都是0。如果某個小朋友第一次被要求交換,則他的不高興程度增加1,如果第二次要求他交換,則他的不高興程度增加2 即不高興程度為3 依次類推...