1113 Integer Set Partition(25 分)

这个题目水成这个样子,,,

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1e5 + 10;
int num[maxn], n;
int main()
{
    scanf("%d", &n);
    int sum = 0;
    for (int i = 0; i < n; i++)scanf("%d", &num[i]),sum += num[i];
    sort(num, num + n);
    int front = 0;
    for (int i = 0; i < n/2; i++)
    {
        front += num[i];
    }
    printf("%d %d",n%2==0?0:1, abs(sum - front - front));
    return 0;
}

算法笔记上有这个题目的解,作者用的是quick sort找出第n/2大的数字,然后分成两堆,但是这种有一个点会超时,我每次选的都是left

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1e5 + 10;
int num[maxn], n;
int partition(int a[], int left, int right)
{
    int temp = a[left];
    while (left < right)
    {
        while (right > left&&a[right] > temp)right--;
        a[left] = a[right];
        while (left < right&&a[left] <= temp)left++;
        a[right] = a[left];
    }
    a[left] = temp;
    return left;
}
int main()
{
    scanf("%d", &n);
    int sum = 0;
    for (int i = 0; i < n; i++)scanf("%d", &num[i]),sum += num[i];
    int k = n / 2, left = 0, right = n - 1, mid;
    while (1)
    {
        int pos = partition(num, left, right);
        if (pos < k)left = pos + 1;
        else if (pos > k) right = pos - 1;
        else if (pos == k)
        {
            mid = pos;
            break;
        }
    }
    int front = 0;
    for (int i = 0; i < mid; i++)front += num[i];
    int back = sum - front;
    printf("%d %d", n % 2 == 0 ? 0 : 1, back - front);
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Bitmap算法 我们可能在算法书中都看过,对于海量数据的处理是有一些独特的算法的,通常来说如下六种: 序号 算法...
    ae0fdc75017d阅读 169评论 0 1
  • 周末来加班,因为产品没有做好他的工作我要来打黑工。心里很难受,突然就感觉很迷茫,自己太软弱了,不敢走出舒适区,也只...
    DerrickWang阅读 256评论 0 0
  • 春风常使人间绿,再把千娇百媚生。 年少抛人容易去,何如一见满条红。 注:春来时,万物先绿,紫荆先花后叶,把最美的一...
    梅心梅飞阅读 449评论 1 15
  • 几天下来,又觉得疲惫不堪了。 已经不想再看见人了。需要一个人多待一会儿,泡一杯茶,清净清净。 感觉整个身体无力,无...
    尚灵心阅读 485评论 0 1