• 202109-1 数组推导


    具体问题

    题目描述

    A1,A2,⋯,An 是一个由 n 个自然数(即非负整数)组成的数组。在此基础上,我们用数组 B1⋯Bn 表示 A 的前缀最大值。
    Bi=max{A1,A2,⋯,Ai}

    如上所示,Bi 定义为数组 A 中前 i 个数的最大值。
    根据该定义易知 A1=B1,且随着 i 的增大,Bi 单调不降。
    此外,我们用 sum=A1+A2+⋯+An 表示数组 A 中 n 个数的总和。

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

    输入格式

    从标准输入读入数据。

    输入的第一行包含一个正整数 n。

    输入的第二行包含 n 个用空格分隔的自然数 B1,B2,⋯,Bn。

    输出格式

    输出到标准输出。

    输出共两行。

    第一行输出一个整数,表示 sum 的最大值。

    第二行输出一个整数,表示 sum 的最小值。

    样例1输入

    1. 6
    2. 0 0 5 5 10 10

    样例1输出

    1. 30
    2. 15

    样例1解释

    数组 A 的可能取值包括但不限于以下三种情况。

    情况一:A=[0,0,5,5,10,10]

    情况二:A=[0,0,5,3,10,4]

    情况三:A=[0,0,5,0,10,0]

    其中第一种情况 sum=30 为最大值,第三种情况 sum=15 为最小值。

    样例2输入

    1. 7
    2. 10 20 30 40 50 60 75

    样例2输出

    1. 285
    2. 285

    样例2解释

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

    子任务

    50% 的测试数据满足数组 B 单调递增,即 0

    全部的测试数据满足 n≤100 且数组 B 单调不降,即 0≤B1≤B2≤⋯≤Bn≤105。

    题目思路

    很简单一道题,通过分析两个样例可知,数组A的sum最大值是B数组的求和,最小值分两种情况:一种是B数组严格单调递增的话,最大值和最小值相等就是B数组的总和;另一种情况是B数组出现了有几个数相等的情况,那么最小值就可以用0去替换相等的数来求和。

    AC代码

    1. #include
    2. using namespace std;
    3. int main(){
    4. int n,sum1=0,sum2=0;
    5. cin>>n;
    6. int B[100001];
    7. for(int i=0;i
    8. cin>>B[i];
    9. sum1+=B[i];
    10. if(B[i]==B[i-1]){
    11. sum2+=0;
    12. }else sum2+=B[i];
    13. }
    14. cout<
    15. return 0;
    16. }
  • 相关阅读:
    Linux下mysql安装配置教程
    数字孪生医疗技术助力医院健康监测系统
    医疗知识图谱 neo4j
    Mathorcup数学建模竞赛第四届-【妈妈杯】C题:家庭暑假旅游套餐的设计(附MATLAB代码)
    数学工程学|正态分布及其图形
    java元注解
    计算属性与watch的区别,fetch与axios在vue中的异步请求,单文本组件使用,使用vite创建vue项目,组件的使用方法
    React 中 keys 的作用是什么?
    数字孪生智慧园区解决方案,可视化平台案例
    内网隧道代理技术(二十六)之 搭建ICMP隧道上线CS
  • 原文地址:https://blog.csdn.net/victory066/article/details/125906837