【笨方法学PAT】1113 Integer Set Partition (25 分)

版权声明:欢迎转载,请注明来源 https://blog.csdn.net/linghugoolge/article/details/84631009

一、题目

Given a set of N (>1) positive integers, you are supposed to partition them into two disjoint sets A​1​​ and A​2​​ of n​1​​ and n​2​​numbers, respectively. Let S​1​​ and S​2​​ denote the sums of all the numbers in A​1​​ and A​2​​, respectively. You are supposed to make the partition so that ∣n​1​​−n​2​​∣ is minimized first, and then ∣S​1​​−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≤10​5​​), 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 2​31​​.

Output Specification:

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

Sample Input 1:

10
23 8 10 99 46 2333 46 1 666 555

Sample Output 1:

0 3611

Sample Input 2:

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

Sample Output 2:

1 9359

二、题目大意

排序求和。

三、考点

vector

四、注意

1、先分组,后求和。

五、代码

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main() {
	//read
	int n;
	cin >> n;
	vector<int> vec(n);
	int sum = 0;
	for (int i = 0; i < n; ++i) {
		cin >> vec[i];
		sum += vec[i];
	}

	//sort
	sort(vec.begin(), vec.end());

	int n1, n2, sum1=0, sum2;
	if (n % 2 == 0) 
		cout << 0 << " ";
	else 
		cout << 1 << " ";
	n1 = n / 2;
	for (int i = 0; i < n1; ++i) {
		sum1 += vec[i];
	}
	cout << sum - 2 * sum1 << endl;

	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/linghugoolge/article/details/84631009
今日推荐