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;}

原创粉丝点击