033整數集合劃分(貪心)
阿新 • • 發佈:2021-02-01
題目描述:
給定一個包含 N個正整數的集合,請你將它劃分為兩個集合 A1 和 A2,其中 A1包含 n1 個元素,A2 包含 n2個元素。
集合中可以包含相同元素。
用 S1表示集合 A1內所有元素之和,S2 表示集合 A2 內所有元素之和。 請你妥善劃分,使得 |n1−n2|儘可能小,並在此基礎上 |S1−S2|儘可能大。輸入格式:
第一行包含整數 N。 第二行包含 N個正整數。
輸出格式:
再一行中輸出 |n1−n2|和 |S1−S2|,兩數之間空格隔開。
資料範圍:
2≤N≤105,
保證集合中各元素以及所有元素之和小於 2^31。輸入樣例1:
10
23 8 10 99 46 2333 46 1 666 555輸出樣例1:
0 3611
輸入樣例2:
13
110 79 218 69 3721 100 29 135 2 6 13 5188 85輸出樣例2:
1 9359
取|n1 - n2|最小的情況:
1、n為偶數,n1 = n2 = n/2 |n1 - n2| = 0
2、n為奇數,n1 = (n/2)下取整 n2 = n1 + 1 |n1 - n2| = 1
取|s1 - s2|最大的情況:
我們不妨設s1 <= s2
將集合從小到大排序,前面的為s1,後面的為s2
import java.util.Arrays;
import java. util.Scanner;
public class Main{
static int N = 100010;
static int n;
static int[] w = new int[N];
public static void main(String[] args) {
Scanner read = new Scanner(System.in);
n = read.nextInt();
for(int i = 0;i < n;i++) w[i] = read.nextInt();
int s1 = 0, s2 = 0;
Arrays.sort(w,0,n);
for (int i = 0;i < n / 2;i++) s1 += w[i];
for(int i = n / 2;i < n;i++) s2 +=w[i];
System.out.println(n % 2 + " " + (s2 - s1));
}
}