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

写在前面
  • 思路分析
    • 理解题意
      • 把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 
    #include 
    #include 
    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;
    }
    

你可能感兴趣的:(PAT(甲级),算法比赛相关,A1113,Integer,Set,Partition,排序)