第23次CCF软件能力认证A题-数组推导 题型:思维题

62 阅读1分钟

4006. 数组推导 - AcWing题库

最大方案

因为b[i]是1到a[i]的前最大值,所以说a[i]最大可以取到b[i],这是一种方案。

例如,当b数组是

0 0 5 5 10 10

a数组最大可以是:

0 0 5 5 10 10

最小方案

因为b数组满足单调性,因为后一个数要么和前一个数值相同,要么比前面一个数值大,因此我们可以画出单调图:

image.png 通过观察图像,我们发现b数组存在许多拐点,且拐点值一定比前面的数大(满足单调性)。

b[i]必须取到拐点的值,因为b[i]是前缀最大。那么a数组要想最小,拐点的值取到和b[i]的值,其他地方的值都取较小值即可,b[i]最小为0,所以a[i]也可以取到0:

code

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int b[N];


int main()
{
    
    int maxn=0,minn=0;
    
    int n;cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>b[i];
        //最大的方案
        maxn+=b[i];   //a[i]全部取到b[i]
        
        
        //最小的方案
        //判断一下是否是拐点
        if(!i||b[i]>b[i-1])    //第一个点不是拐点  比前面值都大的点是拐点
        {
            minn+=b[i];
        }
    }
    
    
    cout<<maxn<<endl<<minn<<endl;
    return 0;
}

image.png