#23563: 完整程式碼


liu76214@gmail.com (Andrew liu)

學校 : 新竹市立建功高級中學
編號 : 92407
來源 : [111.243.122.123]
最後登入時間 :
2021-08-15 15:26:39
a737. 10041 - Vito's family -- UVa10041 | From: [163.22.18.54] | 發表日期 : 2020-11-27 22:56

//

// Andrew Liu

// 2020.11.26.

// UVa10041

/*

 3          --> r

 2 / 2 4    num_home / door_mbs[]

 3 / 2 4 6

 4 / 2 1 999 5

 */

#include <stdio.h>

#include <math.h>

#define SWAP(x,y) {int t; t = x; x = y; y = t;}

void quick_sort(int number[],int left,int right);

 

int main(){

    int r;                                               // r = 有多少組測試資料

    scanf("%d", &r);

    int ans[r],a = 0;

    for(int i = 0; i < r; i++){                          // 分開執行,一組一組做

        int num_home;

        scanf("%d", &num_home);

        int door_mbs[num_home];

        for(int i = 0; i < num_home; i++)

            scanf("%d",&door_mbs[i]);

        quick_sort(door_mbs,0,num_home-1);               // (number[],left,right)

        

        if(num_home % 2 == 0){

            // 中位數找 door_mbs[ num_home/2 ]

            int cal = 0;

            for(int j = 0; j < num_home/2; j++){

                cal += (door_mbs[num_home/2-1] - door_mbs[j]);

                cal += (door_mbs[num_home-j-1] - door_mbs[num_home/2-1]);

                

            }

            ans[a] = cal;

            a++;

        }

        else{

            // 中位數找 door_mbs[ ceil(num_home/2); ]

            int cal = 0;

            int k = ceil(num_home/2);

            for(int j = 0; j < k; j++){

                cal += (door_mbs[k] - door_mbs[j]);

                cal += (door_mbs[num_home-j-1] - door_mbs[k]);

            }

            ans[a] = cal;

            a++;

        }

    }

    for(int i = 0; i < r; i++)

        printf("%d\n", ans[i]);

    return 0;

}

 

void quick_sort(int number[],int left,int right){

    if(left < right) {

        int s = number[(left+right)/2];

        int i = left - 1;

        int j = right + 1;

 

        while(1) {

            while(number[++i] < s) ;  // 向右找

            while(number[--j] > s) ;  // 向左找

            if(i >= j)

                break;

            SWAP(number[i], number[j]);

        }

 

    quick_sort(number, left, i-1);   // 對左邊進行遞迴

    quick_sort(number, j+1, right);  // 對右邊進行遞迴

    }

}

 
ZeroJudge Forum