最大方案
因为b[i]是1到a[i]的前最大值,所以说a[i]最大可以取到b[i],这是一种方案。
例如,当b数组是
0 0 5 5 10 10
a数组最大可以是:
0 0 5 5 10 10
最小方案
因为b数组满足单调性,因为后一个数要么和前一个数值相同,要么比前面一个数值大,因此我们可以画出单调图:
通过观察图像,我们发现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;
}