codeforces 1038 D 相对贡献值

原题链接

在这里插入图片描述
在这里插入图片描述

题意

有n只史莱姆,每只史莱姆有一个分数,每次一只史莱姆可以吞掉左边的或者右边的史莱姆(要是有的话),然后ta的分数会减去被吞的史莱姆的分数,问最后剩下的史莱姆分数最大为多少

思路

  1. 我们分类讨论,然后进行总结
  2. 假如有正有负,那么我们可以用负数减去正数,让其越减越小,但绝对值越大,最后用正数减去,就能得到最大的值,这样我们虽然一直在减来减去,但是绝对值一直没有变,最后输出的答案也是“没有损耗”的,所以,假如有正有负,最后的答案就应该是所有数绝对值的和。
  3. 假如全是正数,那么我们通过刚才的推理考虑,一定要产生负数,最后用正数减去负数得到一个更大的正数,所以我们尽可能地用小的减去大的。同理,如果全是负的,就用大的减去小的。所以,假如全正全负,最后的答案就应该是所有数绝对值的和减去所有数中绝对值最小的数的二倍。
  4. 为什么是二倍呢 ,因为如果是正负的话,假设a是最小值我们贡献值就是a+b,但是只有正或负,贡献值就是 |a-b| ,这样对于原来的结果就少了两个a,所以是二倍
  5. 注意要特判n=1, 还有long long

AC代码

#include<cstdio>
#include<cmath>
#include<algorithm>

typedef long long ll;
using namespace std;
int n;
int pos, neg;
ll sum, minn = 1e9;

int main() {
    scanf("%d", &n);
    if (n == 1) {
        ll a;
        scanf("%lld", &a);
        printf("%lld", a);
        return 0;
    }
    for (int i = 1; i <= n; i++) {
        ll a;
        scanf("%lld", &a);
        if (a > 0)
            pos++;
        if (a < 0)
            neg++;
        sum += abs(a);
        minn = min(minn, abs(a));
    }
    if (pos > 0 && neg > 0)
        printf("%lld", sum);
    else
        printf("%lld", sum - minn * 2);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值