codeforces round 508(div2) D. Slime

这道题的核心规律就是,一串数字,里面有正有负,他们最后能达到的值可以是绝对值之和,也可以是负的绝对值之和。

如果只有正数或者只有负数,那就要减掉两倍最小值。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF=1e9+7;
int a[500010];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
       scanf("%d",&a[i]);
    if(n==1)
    {
        printf("%d\n",a[1]);
        return 0;
    }
    int pos=0,neg=0;
    for(int i=1;i<=n;i++)
    {
        if(a[i]>=0)
          pos++;
        else
          neg++;
    }
    if(pos==n)
    {
        ll res=0;
        int mina=INF;
        for(int i=1;i<=n;i++)
        {
            mina=min(a[i],mina);
            res+=a[i];
        }
        res-=2*mina;
        printf("%lld\n",res);
        return 0;
    }
    else if(neg==n)
    {
        ll res=0;
        for(int i=1;i<=n;i++)
        {
            a[i]=-a[i];
        }
            int mina=INF;
        for(int i=1;i<=n;i++)
        {
            mina=min(a[i],mina);
            res+=a[i];
        }
        res-=2*mina;
        printf("%lld\n",res);
        return 0;
    }
    else
    {
            ll res=0;
            for(int i=1;i<=n;i++)
               res+=abs(a[i]);
            printf("%lld\n",res);
            return 0;
    }
}

猜你喜欢

转载自www.cnblogs.com/lishengkangshidatiancai/p/10223566.html