首页 > 其他 > 详细

T137288 铸星

时间:2020-06-24 14:36:14      阅读:43      评论:0      收藏:0      [点我收藏+]

有以下三种情况:

  1. 只有一个数,直接输出。
  2. 有正数也有复数,那就先让负数撞正数得到更小的负数,直到剩下最后一个正数撞所有的负数,答案是所有数的绝对值之和。
  3. 仅有正数或者仅有负数,就先找一对不相等的相邻的数$x$和$y$来得到另外一个符号的数,回到第二种情况,答案是绝对值之和$-\left|x\right|-\left|y\right|+\left|x-y\right|$。那么只要后面这串式子最大即可。

 

代码:

技术分享图片
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define IL inline
#define RG register
using namespace std;
typedef long long LL;
#define RI RG int
#define RC RG char
const int N=5e5;

    int n;
    LL a[N+3];

int main(){
    scanf("%d",&n);
    for(RI i=1;i<=n;i++)
        scanf("%lld",&a[i]);
        
    if(n==1){
        printf("%lld",a[1]);
        return 0;
        
    }
    
    LL s=0;
    int c=0;
    for(RI i=1;i<=n;i++){
        s+=abs(a[i]);
        c+=(a[i]>0);
        
    }
    
    if(c!=0&&c!=n){
        printf("%lld",s);
        return 0;
        
    }
    
    LL x=-1LL<<60;
    for(RI i=2;i<n;i++)
        x=max(x,abs(a[i]-a[i+1])-abs(a[i])-abs(a[i+1]));
    printf("%lld",s+x);

    return 0;

}
View Code

 

T137288 铸星

原文:https://www.cnblogs.com/Hansue/p/13187328.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!