PAT 1113 Integer Set Partition

这篇博客讲解了一种算法,如何将一组正整数划分为两个集合,使得两个集合中数字个数差的绝对值最小,同时两集合和的绝对差值最大。通过实例演示和代码实现,适合考研准备者理解并应用于算法问题解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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/2,就是第一个集合的数字个数,将数组排好序后,从小到大将前n/2个数字相加,值就是第一个集合的和,剩下数字的和  数字个数就是集合②的信息

代码:

#include <iostream>
#include <algorithm>
using namespace std;

int main(){
    int n;
    scanf("%d",&n);
    int a[n];
    
    for(int i=0;i<n;i++)    scanf("%d",&a[i]);
    sort(a,a+n);
    int s1=0,s2=0,n1=n/2,n2=n-n1;
    for(int i=0;i<n1;i++)   s1+=a[i];
    for(int i=n1;i<n;i++)   s2+=a[i];
    printf("%d %d\n",n2-n1,s2-s1);
    return 0;
}

好好学习,天天向上!

我要考研!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值