A1113 Integer Set Partition (25 分| 排序,附详细注释,逻辑分析)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_24452475/article/details/100587898

写在前面

  • 思路分析
    • 理解题意
      • 把1个集合分成两个不相交集合,使得2个集合元素个数相差最小,2个集合总和之差最大
    • 逻辑分析
      • 把集合内n个元素排序,计算前n/2个元素总和,用总和sum – 2 * halfsum即为 |S1– S2|
      • |n1 – n2|就是n % 2的结果,奇数为1,偶数为0
  • 题目简单,10分钟a题
    • 略水

测试用例

  • input:
    10
    23 8 10 99 46 2333 46 1 666 555
    output:
    0 3611
    
    input:
    13
    110 79 218 69 3721 100 29 135 2 6 13 5188 85
    output:
    1 9359
    

ac代码

  • #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    int main()
    {
        int n, sum = 0, halfsum = 0;
    
        scanf("%d", &n);
        for(int i=0; i<n; i++)
        {
            scanf("%d", &v[i]);
            sum += v[i];
        }
        sort(v.begin(), v.end());
        for(int i=0; i<n/2; i++)
            halfsum += v[i];
        // 累加1次,做差1次
        printf("%d %d", n%2, sum-2*halfsum);
    
        return 0;
    }
    

猜你喜欢

转载自blog.csdn.net/qq_24452475/article/details/100587898
今日推荐