【PAT甲级 - C++题解】1113 Integer Set Partition

简介: 【PAT甲级 - C++题解】1113 Integer Set Partition

1113 Integer Set Partition


Given a set of N (>1) positive integers, you are supposed to partition them into two disjoint sets A1 and A2 of n1 and n2 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−S2∣ 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−S2∣, 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


题意

给定 n 个数,将这 n 个数划分成两个集合 A1 和 A2 ,其中 A1 包含 n1 个数且这些数之和为 s1 ,A2 包含 n2 个数且这些数之和为 s2 。


现在需要我们使 |n2-n1| 的值尽可能的小,且 |s2-s1| 的值尽可能的大。


思路

直接上结论,我们只要将数组先排个序,然后尽可能均匀的分成两部分,所以 |n2-n1| 的值只可能为 0 或 1 ,且左半部分的值都是小于右半部分的,这样就能使 |s2-s1| 的值最大。


代码

#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int w[N];
int n;
int main()
{
    cin >> n;
    for (int i = 0; i < n; i++)    cin >> w[i];
    //进行排序
    sort(w, w + n);
    //计算两部分数值的和
    int s1 = 0, s2 = 0;
    for (int i = 0; i < n / 2; i++)  s1 += w[i];
    for (int i = n / 2; i < n; i++)  s2 += w[i];
    //输出结果
    cout << n % 2 << " " << s2 - s1 << endl;
    return 0;
}
目录
相关文章
|
1月前
|
算法 数据处理 C++
c++ STL划分算法;partition()、partition_copy()、stable_partition()、partition_point()详解
这些算法是C++ STL中处理和组织数据的强大工具,能够高效地实现复杂的数据处理逻辑。理解它们的差异和应用场景,将有助于编写更加高效和清晰的C++代码。
22 0
|
4月前
|
C++ 容器
【C++】map和set封装
【C++】map和set封装
38 2
|
4月前
|
存储 C++ 容器
【C++】map和set深度讲解(下)
【C++】map和set深度讲解(下)
63 2
|
4月前
|
存储 自然语言处理 Java
【C++】map和set深度讲解(上)
【C++】map和set深度讲解(上)
43 2
|
4月前
|
存储 C++ 容器
|
5月前
|
C++ 容器
C++之set/multiset容器
C++之set/multiset容器
|
5月前
|
存储 自然语言处理 C++
【C++航海王:追寻罗杰的编程之路】set|map|multiset|multimap简单介绍
【C++航海王:追寻罗杰的编程之路】set|map|multiset|multimap简单介绍
43 0
【C++航海王:追寻罗杰的编程之路】set|map|multiset|multimap简单介绍
|
5月前
|
存储 算法 NoSQL
C++一分钟之-map与set容器详解
【6月更文挑战第21天】C++ STL的`map`和`set`是基于红黑树的关联容器,提供有序存储和高效查找。`map`存储键值对,键唯一,值可重复;`set`仅存储唯一键。两者操作时间复杂度为O(log n)。常见问题包括键的唯一性和迭代器稳定性。自定义比较函数可用于定制排序规则,内存管理需注意适时释放。理解和善用这些工具能提升代码效率。
63 3
|
5月前
|
存储 编译器 C++
|
4月前
|
存储 C++ 容器
【C++】开散列实现unordered_map与unordered_set的封装
【C++】开散列实现unordered_map与unordered_set的封装
52 0