1113 Integer Set Partition (25point(s)) - C語言 PAT 甲級

1113 Integer Set Partition (25point(s))

Given a set of N (>1) positive integers, you are supposed to partition them into two disjoint sets A1 and A​2 of n​1​​ and n​2​​ numbers, respectively. Let S1​​ and S2 denote the sums of all the numbers in A1​​ and A2​​, respectively. You are supposed to make the partition so that ∣n1​​−n2​​∣ is minimized first, and then ∣S1​​−S​2​​∣ is maximized.

Input Specification:

Each input file contains one test case. For each case, the first line gives an integer N (2≤N≤105​), and then N positive integers follow in the next line, separated by spaces. It is guaranteed that all the integers and their sum are less than 231.

Output Specification:

For each case, print in a line two numbers: ∣n1​​−n2​​∣ and ∣S1​​−S​2​​∣, separated by exactly one space.

Sample Input:

10
23 8 10 99 46 2333 46 1 666 555

Sample Output:

0 3611

Sample Input:

13
110 79 218 69 3721 100 29 135 2 6 13 5188 85

Sample Output:

1 9359

題目大意:

輸入 N 個數,分爲兩個集合,使兩個集合元素個數相差最小,元素之和相差最大

輸出相差個數 ∣n1​​−n2​​∣,元素和的差 ∣S1​​−S​2​​∣

設計思路:

元素排序,前一半爲集合 1,後一半爲集合 2,計算輸出

編譯器:C (gcc)
#include <stdio.h>

int cmp(const void *a, const void *b)
{
        return *((int *)a) - *((int *)b);
}

int main(void)
{
        int n, a[100010];
        int i;
        int s1 = 0, s2 = 0;

        scanf("%d", &n);
        for (i = 0; i < n; i++)
                scanf("%d", a + i);
        qsort(a, n, sizeof(a[0]), cmp);
        for (i = 0; i < n / 2; i++)
                s1 += a[i];
        for (i; i < n; i++)
                s2 += a[i];
        printf("%d %d", n % 2, s2 - s1);
        return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章