Slime-(找数学规律)-Codeforces Round #508 (Div. 2)

本文探讨了一道算法题目,通过分析相邻数相减合并操作后的序列,目标是找出最终剩余数的最大可能值。文章提供了详细的解题思路,包括如何利用排序和数学规律简化复杂度,以及完整的AC代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目传送门
题意:
相邻的数相减合并,求最后剩下的一个数的max.
思路:
这种可以找几个简单的例子,看出规律。找不变的规律,表面上看起来很复杂,抓住问题的本质就很简单了 。用min不断减去相邻的+数,max不断减去相邻的-数,最后的值就是max_sum
排序后,首先是最大值和最小值是确定的,max是加,min是减,然后讨论中间的数,若全是-,则用max减去它们,
//若全是+,则用min减去它们,若有-有+,则用自身的-减去相邻的+

AC code:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;//这种可以找几个简单的例子,看出规律 
const int maxn = 5e5 + 100;//寻找不变的规律,表面上看起来很复杂,抓住问题的本质就很简单了 
int a[maxn];
/*
用min不断减去相邻的+数,max不断减去相邻的-数,最后的值就是max_sum 
排序后,首先是最大值和最小值是确定的,max是加,min是减,然后讨论中间的数,若全是-,则用max减去它们,
//若全是+,则用min减去它们,若有-有+,则用自身的-减去相邻的+ 
*/ 
int n = 0;//
int main(){
    while(scanf("%d",&n) != EOF){
        for(int i = 1;i <= n;++i){
            scanf("%d",&a[i]);
        }
        if(n == 1){
            printf("%d\n",a[1]);
            continue; 
        }
        sort(a + 1,a + 1 + n);//排序 
        LL sum = 0;
        sum += a[n];//最大值肯定是相加 
        sum -= a[1];//最小值是相减 
        for(int i = 2;i <= n - 1;++i){//其他的就是取绝对值 
            sum += abs(a[i]);
        }
        printf("%I64d\n",sum);
    }

    return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值