UVa 10041 - Vito's Family
来源:互联网 发布:artemis软件 编辑:程序博客网 时间:2024/05/21 09:12
/*方法一、 排序后求A[n/2], 时间复杂度nlgn*/#include <cstring>#include <cstdio>#include <algorithm>using namespace std;const int MAXN = 500+5;int A[MAXN];int n;int main(){ #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); #endif int T; scanf("%d", &T); while(T--) { scanf("%d", &n); for(int i=0; i<n; i++) { scanf("%d", &A[i]); } sort(A, A+n); int idx = A[n/2]; int sum = 0; for(int i=0; i<n/2; i++) { sum += idx - A[i]; } for(int i=n/2; i<n; i++) { sum += A[i] - idx; } printf("%d\n", sum); } return 0;}
/*方法二、 快速排序求中位数,时间复杂度为O(n)*/#include <cstring>#include <cstdio>#include <algorithm>using namespace std;const int MAXN = 500+5;int A[MAXN];int n;int part(int p, int q){ int key = A[q-1]; int i=p-1; for(int j=p; j<q-1; j++) { if(A[j] < key) { swap(A[++i], A[j]); } } swap(A[q-1], A[++i]); return i;}//区间[p, q)int getk(int p, int q, int k){ if(q - p == 1) return A[p]; int m = part(p, q); if(m == k) return A[m]; if(m < k) return getk(m+1, q, k); else return getk(p, m, k);}int main(){ #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); #endif int T; scanf("%d", &T); while(T--) { scanf("%d", &n); for(int i=0; i<n; i++) { scanf("%d", &A[i]); } int idx = getk(0, n, n/2); int sum = 0; for(int i=0; i<n; i++) { sum += abs(A[i]-idx); } printf("%d\n", sum); } return 0;}