CSP202109-1 数组推导(cc++)

108 阅读2分钟

CSP:202109-1 数组推导

问题描述

A1,A2,,AnA_1, A_2, \cdots, A_n 是一个由 nn自然数(即非负整数)组成的数组。在此基础上,我们用数组 B1BnB_1 \cdots B_n 表示 AA 的前缀最大值。

Bi=max{A1,A2,,Ai}{{B_i = \max \left\{ A_1, A_2, \cdots, A_i \right\} }}

如上所示,BiB_i 定义为数组 AA 中前 ii 个数的最大值。
根据该定义易知 A1=B1A_1 = B_1,且随着 ii 的增大,BiB_i 单调不降。
此外,我们用 sum=A1+A2++Ansum = A_1 + A_2 + \cdots + A_n 表示数组 AAnn 个数的总和。

现已知数组 BB,我们想要根据 BB 的值来反推数组 AA
显然,对于给定的 BBAA 的取值可能并不唯一。
试计算,在数组 AA 所有可能的取值情况中,sumsum 的最大值和最小值分别是多少?

输入格式

从标准输入读入数据。
输入的第一行包含一个正整数 nn
输入的第二行包含 nn 个用空格分隔的自然数 B1,B2,,BnB_1, B_2, \cdots, B_n

输出格式

输出到标准输出。
输出共两行。
第一行输出一个整数,表示 sumsum 的最大值。
第二行输出一个整数,表示 sumsum 的最小值。

样例1输入

6
0 0 5 5 10 10

样例1输出

30
15

样例1解释

数组 AA 的可能取值包括但不限于以下三种情况。
情况一:A=[0,0,5,5,10,10]A = [0, 0, 5, 5, 10, 10]
情况二:A=[0,0,5,3,10,4]A = [0, 0, 5, 3, 10, 4]
情况三:A=[0,0,5,0,10,0]A = [0, 0, 5, 0, 10, 0]
其中第一种情况 sum=30sum = 30 为最大值,第三种情况 sum=15sum = 15 为最小值。

样例2输入

7
10 20 30 40 50 60 75

样例2输出

285
285

样例2解释

A=[10,20,30,40,50,60,75]A = [10, 20, 30, 40, 50, 60, 75] 是唯一可能的取值,所以 sumsum 的最大、最小值均为 285285

子任务

50%50\% 的测试数据满足数组 BB 单调递增,即 0<B1<B2<<Bn<1050 < B_1 < B_2 < \cdots < B_n < 10^{5}
全部的测试数据满足 n100n \le 100 且数组 BB 单调不降,即 0B1B2Bn1050 \le B_1 \le B_2 \le \cdots \le B_n \le 10^{5}

code

#include<iostream>
using namespace std;

int main(){
	int n,sum1=0,sum;
	int min=0,max=0;
	cin>>n;
	for(int a=0;a<n;a++){
		cin>>sum;
		min+=sum>sum1?sum:0;
		max+=sum;
		sum1=sum;
	}
	cout<<max<<"\n"<<min;
	return 0;
}