蓝桥最大珠宝和

本文介绍了一种算法,通过在数组中一次操作(交换奇数位置元素和偶数位置元素),确保所有元素为正后,最大化奇数部分的最小值与偶数部分的最大值之和(asum)。作者用C++代码展示了如何实现这一过程。

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

由题目规律可以知道,当下标为奇数时,则符号为正,反之为负。思路是题目中说可以进行一次操作,既交换两个数的位置。首先将数组所有元素保证为正数,然后计算出不进行操作此时的珠宝和sum的值。按题目要求我们需要sum的值达到最大,则分别找到奇数中的最小值,和偶数中的最大值,将这两个值进行交换来达到目的。然后新的珠宝和asum可以表示为sum+2max-2min;然后再去比较sum和asum的大小,输出最大值即可。

此处要注意long long 因为Ai的值可以达到十的正负九次方。

下面是代码示例:

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

const int N=1e5+10;

ll a[N],b[N];

int main()

{

  int n;cin>>n;

  for(int i=1;i<=n;i++)

  {

    cin>>a[i];

    if(a[i]<0) a[i]=-a[i];

  }

  int min=a[1],max=a[2];

  ll sum=0,asum;

  for(int i=1;i<=n;i++)

  {

    if(i%2){

      if(min>a[i]) 

    {

        min=a[i];

      }

      sum+=a[i];

    }

    else{

      if(max<a[i]) 

    {

        max=a[i];

      }

      sum-=a[i];

    }

  }

  asum=sum+2*max-2*min;

  if(asum>sum) cout<<asum;

  else cout<<sum;

  return 0;

}

我是小蒟蒻,浅看以下当个乐子吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值