第十題:小朋友排隊(19')
n 個小朋友站成一排。現在要把他們按身高從低到高的順序排列,但是每次只能交換位置相鄰的兩個小朋友。
每個小朋友都有乙個不高興的程度。開始的時候,所有小朋友的不高興程度都是0。
如果某個小朋友第一次被要求交換,則他的不高興程度增加1,如果第二次要求他交換,則他的不高興程度增加2(即不高興程度為3),依次類推。當要求某個小朋友第k次交換時,他的不高興程度增加k。
請問,要讓所有小朋友按從低到高排隊,他們的不高興程度之和最小是多少。
如果有兩個小朋友身高一樣,則他們誰站在誰前面是沒有關係的。
【資料格式】
輸入的第一行包含乙個整數n,表示小朋友的個數。
第二行包含 n 個整數 h1 h2 … hn,分別表示每個小朋友的身高。
輸出一行,包含乙個整數,表示小朋友的不高興程度和的最小值。
例如,輸入:
33 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
請嚴格按要求輸出,不要畫蛇添足地列印類似:「請您輸入...」 的多餘內容。
所有**放在同乙個原始檔中,除錯通過後,拷貝提交該原始碼。
注意: main函式需要返回0
注意: 只使用ansi c/ansi c++ 標準,不要呼叫依賴於編譯環境或作業系統的特殊函式。
注意: 所有依賴的函式必須明確地在原始檔中 #include , 不能通過工程設定而省略常用標頭檔案。
提交時,注意選擇所期望的編譯器型別。
快速解題思路:逆序對啊,每點的左邊大於它的,右邊小於它的數的個數。就是當前點的逆序對數。而對於此題的數量級,最慘能接受o(nlogn)的時間複雜度。求乙個序列的逆序對數,最直接最暴力的方法就是直接算,for迴圈直接求。 這樣應該可以過30%的資料,能拿分。 但是求逆序對有o(nlogn)的歸併排序演算法。改造一番,可以達到效果。
**:
#include #include #include using namespace std;
#define n 100010
#define max 1000100
int c[max], s[max], b[n];
long long total[n], ans;
int num[n], t, s, t, i, j;
int lowbit(int x)
void add(int pos,int num,int *p)
}
int sum(int end,int *p)
return cnt;
}
void init()
}
int main()
//printf("\n");
ans = 0;
for(j = t-1; j > -1; --j)
//printf("\n");
printf("%i64d\n",ans);
} return 0;
}
小朋友排隊
n 個小朋友站成一排。現在要把他們按身高從低到高的順序排列,但是每次只能交換位置相鄰的兩個小朋友。每個小朋友都有乙個不高興的程度。開始的時候,所有小朋友的不高興程度都是0。如果某個小朋友第一次被要求交換,則他的不高興程度增加1,如果第二次要求他交換,則他的不高興程度增加2 即不高興程度為3 依次類推...
小朋友排隊
問題描述 n 個小朋友站成一排。現在要把他們按身高從低到高的順序排列,但是每次只能交換位置相鄰的兩個小朋友。每個小朋友都有乙個不高興的程度。開始的時候,所有小朋友的不高興程度都是0。如果某個小朋友第一次被要求交換,則他的不高興程度增加1,如果第二次要求他交換,則他的不高興程度增加2 即不高興程度為3...
小朋友排隊
n 個小朋友站成一排。現在要把他們按身高從低到高的順序排列,但是每次只能交換位置相鄰的兩個小朋友。每個小朋友都有乙個不高興的程度。開始的時候,所有小朋友的不高興程度都是0。如果某個小朋友第一次被要求交換,則他的不高興程度增加1,如果第二次要求他交換,則他的不高興程度增加2 即不高興程度為3 依次類推...