PAT甲级 1113 Integer Set Partition

本文介绍了一个编程问题,给定一个整数数组,如何通过划分成两部分使得两部分的元素数量差最小且两部分之和的差值最大。通过C++代码实现,利用排序策略找到最佳分割方案。
摘要由CSDN通过智能技术生成

题目

在这里插入图片描述
题目的意思是给你n个数,让你分成两部分,这两部分数的个数相差要最小并且两部分相减的和最大

思路

要使两部分数个数相差最小肯定就是平分/2,如果是一个偶数个数相差为0,如果是一个奇数个数相差为1,。
要求两部分数的和相减值最大,所以要排序直接用sort排就可以,只有第一部分数为小的数且个数少时与第二部分为大的数和相减得到的数才能最大。所以当n为奇数时,第二部分的数比第一部分要多一个。

代码

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n,s=0,a[100010]={0};
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    sort(a+1,a+n+1);
    for(int i=1;i<=n/2;i++)//第一部分小的数
        s-=a[i];
    for(int i=n/2+1;i<=n;i++)//第二部分大的数
        s+=a[i];
    cout<<n-(n/2)*2<<" "<<s;
    return 0;
}
  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值