时间:1s 空间:512M
题目描述:
有 n 个数,你需要把这些数分成两个组,每个数必须在其中一个组里,组可以为空。令第一个组数的和为 s1,第二个组数的和为 s2,求最大的 |s1|−|s2|。
比如现在有4个数:[11,0,−1,−2]
可以这么分组:第一组为[11,−1],第二组为[0,−2],
|s1|−|s2|=|11+(−1)|−|0+(−2)|=10−2=8;
也可以这么分组:第一组为[11,0,−1,−2],第二组为空,|s1|−|s2|=8。
可以证明没有分组策略使得 |s1|−|s2| 的值大于8,所以 8 是答案。
输入格式:
第一行包含一个整数 n。
第二行包含 n 个整数 ai 。
输出格式:
输出一个整数表示答案。
样例输入: 4
11 0 -1 -2
样例输出:
8
约定: 对于100%的数据,1≤n≤105,−1e9≤ai≤1e9。
题意:
把n个数分成两组,一组中所有数的和是s1,第二组所有数的和s2,使s1的绝对值-s2的绝对值的值最大。
思路:
首先判断一下ai的正负(0可以跟正或负一起判断),因为正的肯定是要加到s1里去才可以最大,负的不论加在s1还是s2是一样的(会让s1减少),所以我们让s1+=所有数,s2=0。
由于s1可以是正数或零或负数,所以|s1|=s1或-s1,s2=0所以|s2|=0。
|s1|-|s2|=s1或-s1,这里判断s1是正数还是负数即可,正数输出s1,负数输出-s1。
注意:这道题的ai最大有1e9所以要用long long。
代码:
#include <bits/stdc++.h>
using namespace std;
long long n;
long long a[100005];
long long s1=0,s2=0,maxn=-1e9-5;
int main(){
cin>>n;
for(long long i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
for(long long i=1;i<=n;i++){
s1+=a[i];//s1加上所有数
}
if(s1<0){ //判断正负
s1=-s1;
}
printf("%lld",s1);
return 0;
}