【C++】问题 G: Bob和Alice(3)

7 篇文章 0 订阅
4 篇文章 1 订阅

问题 G: Bob和Alice(3)

内存限制:128 MB时间限制:1.000 S评测方式:文本比较

题目描述

求的是最大值!!!

Bob和Alice在玩一个序列游戏

有一个n-1个数的序列

B1 B2 ....... Bn−1

Bob又定义了一个新的序列

A1 A2 .......An

对每一个i [1 <= i <= n - 1]

Bi>=max(Ai,Ai+1)

好奇的Alice想知道A序列在这样的约束之下

A序列的总和的最大值是多少

即求max∑i=1nan ;

输入

n

B1 B2 .......Bn−1

2 <= n <= 100

0 <= Bi <= 105

输出

A序列的总和的最大值是多少

样例输入
6
0 153 10 10 23
​
样例输出
53
题解:

我认为这道题最重要的点还是在于读题,读完题之后,我们知道要求A整个序列的最大值.

B数组是肯定要建,但不一定需要创建A数组去解决本题。

为什么呢?

因为与其说是在找A的max(Ai,Ai+1),倒不如说是在找B的Bi,Bi+1大小关系。换言之,既然求的并非A中单个元素,而是整个A序列的最大总和,那么我们就可以抽象为通过判断B的Bi,Bi+1大小关系来判断加和的多少;

我们可以先画一张图,就拿测试用例来说:

三角形表示了Bi对于Ai,Ai+1的对应关系,那么我们发现,如果我们要使的A6最大,只需要填B5也就是23即可,因为它的大小只由一个三角形对应;但如果我们要使得A5最大,就要考虑两个三角形也就是两层对应关系。这两层对应关系并非毫无关联,因为我们发现它取决于B4和B5的大小关系,如下图所示:

因为10<23,所以A5里面我们可以放心的填入10。所以也就是说当B[i]<=B[i+1]时,A[i+1]就等于B[i];之所以说必须是当B[i]<=B[i+1]时,是因为还有如图所示的情况发生:

B2=153>B3,当B[i]>B[i+1]时,我们不能在A[i+1]里填入B[i],假设我们填入153就和前面一个三角形冲突了,使得B3<A3,而这明显是不符合定义的。但我们可以填入A[i+2](==B[i+1])。

所以我们只需要让两个三角形其实也就是B[i]和B[i+1]的大小关系解决好中间部分的迭代求和,剩下的A[0]和A[n]显然很好处理,处理完加上去就可以。给出AC代码如下:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<cmath>
#include<vector>
using namespace std;


int main()
{
    int n, B[100] = { 0 }, temp;
    cin >> n;
    if (n == 2)//处理掉n-3会出界的问题.
    {
        cin >> temp;
        cout << 2 * temp << endl;
        exit(0);
    }
    for (int i = 0; i < n - 1; ++i)
    {
        cin >> B[i];

    }
    int sum = B[n - 2];
    for (int i = n - 3; i >= 0; --i)
    {
        
         if (i != 0)
        {
            if (B[i] > B[i + 1])
                sum += B[i + 1];
            else if (B[i] <= B[i + 1])
                sum += B[i];

        }
        else
        {
            if (B[i] <= B[i + 1])
                sum += 2 * B[i];
            else
                sum += B[0]+B[1];
        }
    }
    cout << sum << endl;

    return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

城主_全栈开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值