小朋友排隊

2021-10-25 17:14:37 字數 1032 閱讀 2752

要想整體的不高興度最小,就需要交換的次數越少越好,那麼怎樣才可以得到最少的交換次數呢?

題目中要求只能交換相鄰兩個數,因此很容易想到氣泡排序,假設原序列有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 依次類推...