1. 程式人生 > 其它 >033整數集合劃分(貪心)

033整數集合劃分(貪心)

技術標籤:演算法貪心演算法java

題目描述:

給定一個包含 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)); } }