By Jalan
知识工具需求
数学
数据结构和算法
语言
- 快速判断正负和奇偶
题干
给一组N>1个正整数,把他们分成两个集合A1A2n1,n2,S1,S2表示两个集合的sum,让n1-n2的绝对值最小,S1-S2的绝对值最大
输入条件
N>=2<=10^5,下面是N个正整数,sum会在int范围内.
输出条件
打印两个绝对值
例子
例1
输入
10
23 8 10 99 46 2333 46 1 666 555
输出
0 3611
例2
输入
13
110 79 218 69 3721 100 29 135 2 6 13 5188 85
输出
1 9359
题解
第一次
思路
- 首先n1-n2绝对值最小,那么两组数的数量最多差1.接下来要让S1-S2最大.则应该让S1尽量大,S2尽量小
- 建立数组输入数据
- 排序数据
- 偶数直接中间分段
- 奇数看中间数的正负,正分入S1,负分入S2
- 计算和,输出.
预期时间复杂度
n
编写用时
10分钟
代码
CPP
#include <algorithm>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
using namespace std;
int main(int argc, char const *argv[])
{
//2
int N;
scanf("%d", &N);
vector<int> list(N);
for (int i = 0; i < N; i++)
{
scanf("%d", &list[i]);
}
//3
sort(list.begin(), list.end());
if (N & 1) //判断奇偶
{
//5 6
int sum = 0;
for (int i = 0; i < N / 2; i++)
{
sum -= list[i];
}
if (list[N / 2] & 0x80000000) //判断正负
{
sum -= list[N / 2];
}
else
{
sum += list[N / 2];
}
for (int i = N / 2 + 1; i < N; i++)
{
sum += list[i];
}
printf("1 %d", sum);
}
else
{
//4 6
int sum = 0;
for (int i = 0; i < N / 2; i++)
{
sum -= list[i];
}
for (int i = N / 2; i < N; i++)
{
sum += list[i];
}
sum = abs(sum);
printf("0 %d", sum);
}
return 0;
}
运行用时
结尾
看在我写了这么多注释的份上可以给我点个赞嘛,求求惹=]砰砰砰,给我加点写下去的油呀@.@
也欢迎关注我的CSDN账号呀,接下来两个月我应该会按这个格式更新所有的PTA甲级题目
**开心code每一天**