小朋友排隊 第五屆藍橋杯

2021-09-07 11:02:53 字數 2492 閱讀 5464

第一種,直接思考的方法,不知對不正確:

/*

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。 資源約定: 峰值記憶體消耗 < 256m cpu消耗 < 1000ms */ public class 小朋友排隊 long start = system.currenttimemillis(); int all = exchange(findmin(count), count); print("不高興的總和數量是=" + all); long end = system.currenttimemillis(); print("此程式執行,花費的時間是" + ((end - start) / 1000.0) + "秒."); print("每乙個小朋友不高興的詳情資訊"); for (int i = 0; i < n; i++) } /** * 交換位置,身高高的向右和身高低的能夠換,否則下乙個相鄰位置 * * @param k * 前搜尋的位置 * @param count * count[0]當前每乙個交換的小朋友的不高興程度和count[1]交換的次數 */ public static int exchange(int k, int count) else } /** * * @return 返回當前相對最高興的小朋友的下標值,(同事滿足身高左高右低的要求) */ public static int findmin(int count) for (int i = 0; i < n; i++) temp[min] = temp[i]; if (min < n - 1 && s[min] > s[min + 1]) return min; } return n - 2; } /** * 交換位置和不高興的值下標k和k+1的交換,同一時候不高興的值新增 * * @return */ public static void exchangeall(int count, int k) public static boolean isok() } return true; } // 當前全部人不高興的值的總和 public static int sum(int count) public static void print(object o) }

輸入和輸出一:

33 2 1

k&k+1=0   1

k&k+1=1   2

k&k+1=0   1

不高興的總和數量是=9

每乙個小朋友不高興的詳情資訊

0不高興的值是=3

1不高興的值是=3

2不高興的值是=3

此程式執行,花費的時間是0.0秒.

輸入和輸出二:

55 4 3 2 1

k&k+1=0   1

k&k+1=2   3

k&k+1=1   2

k&k+1=3   4

k&k+1=0   1

k&k+1=2   3

k&k+1=1   2

k&k+1=3   4

k&k+1=0   1

k&k+1=2   3

不高興的總和數量是=50

每乙個小朋友不高興的詳情資訊

0不高興的值是=10

1不高興的值是=10

2不高興的值是=10

3不高興的值是=10

4不高興的值是=10

此程式執行,花費的時間是0.001秒.

輸入和輸出三:

52 5 4 3 1

k&k+1=1   2

k&k+1=3   4

k&k+1=2   3

k&k+1=1   2

k&k+1=0   1

k&k+1=3   4

k&k+1=2   3

不高興的總和數量是=29

此程式執行,花費的時間是0.0秒.

每乙個小朋友不高興的詳情資訊

0不高興的值是=10

1不高興的值是=1

2不高興的值是=6

3不高興的值是=6

4不高興的值是=6

第五屆 小朋友排隊

目前不會!n 個小朋友站成一排。現在要把他們按身高從低到高的順序排列,但是每次只能交換位置相鄰的兩個小朋友。每個小朋友都有乙個不高興的程度。開始的時候,所有小朋友的不高興程度都是0。如果某個小朋友第一次被要求交換,則他的不高興程度增加1,如果第二次要求他交換,則他的不高興程度增加2 即不高興程度為3...

小朋友排隊 第五屆藍橋杯b組

氣泡排序 要交換的次數等於序列中逆序對的個數。設逆序對數量k,所以交換次數至少是k。每一次交換後逆序對數量必然減一。所以總數最小是k。include include include includeusing namespace std typedef long long ll const int n...

小朋友排隊 藍橋杯

因此我們可以借助樹狀陣列來求解前面比它大的個數,即逆序對 求後面比它小的個數的時候我們可以倒著插入,直接統計即可 因為有的資料為0,所以我們需要將所有插入的資料 1 另外統計的時候要處理相同的數,統計前面的數的時候不用減1,統計後面的數的時候需要減1 這樣處理的原因自己思考一下便出來了 includ...