CCF202109-1 数组推导(100分)序列处理

Posted 海岛Blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CCF202109-1 数组推导(100分)序列处理相关的知识,希望对你有一定的参考价值。

试题编号: 202109-1
试题名称: 数组推导
时间限制: 1.0s
内存限制: 512.0MB
问题描述:

题目描述
A1,A2,…,An是一个由 n个自然数(即非负整数)组成的数组。在此基础上,我们用数组B1…Bn表示A的前缀最大值。
B i = m a x { A 1 , A 2 , . . . , A i } Bi=max\\{A1,A2,...,Ai\\} 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输入
6
0 0 5 5 10 10
样例1输出
30
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输入
7
10 20 30 40 50 60 75
样例2输出
285
285
样例2解释
A = [10, 20, 30, 40, 50, 60, 75] 是唯一可能的取值,所以 sum 的最大、最小值均为 285。

子任务
50% 的测试数据满足数组 B 单调递增,即 0 < B1 < B2 < … < Bn < 105

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

问题链接CCF202109-1 数组推导
问题简述:(略)
问题分析
  需要计算B数组之和,B数组不重复数之和。
  由于B单调递增,用C/C++和Java语言程序中,去除重复只需要前后元素进行比较就可以了。
  这个题没有必要用数组来存储读入的数据,读入数据流中的数据进行计算处理就可以了。
程序说明:Python的解题程序由仙客传奇团队的郭同学提供。
参考链接:(略)
题记:(略)

100分的C语言程序如下:

/* CCF202109-1 数组推导 */

#include <stdio.h>

int main()
{
    int n, b, last = - 1, sum = 0, sum2 = 0, i;
    scanf("%d", &n);
    for (i = 1; i <= n; i++) {
        scanf("%d", &b);
        sum += b;
        if (b != last) sum2 += b;
        last = b;
    }
    printf("%d\\n%d\\n", sum, sum2);

    return 0;
}

100分的Java语言程序如下:

/* CCF202109-1 数组推导 */

import java.util.Scanner;

public class Main {
	public static void main(String args[]){
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt(), b, last = -1, sum = 0, sum2 = 0;
		for (int i = 1; i <= n; i++) {
			b = sc.nextInt();
			sum += b;
			if (b != last) sum2 += b;
			last = b;
		}
            	System.out.println(sum);
            	System.out.println(sum2);	
	}
}

100分的Python语言程序如下:

# CCF202109-1 数组推导

n = int(input())
nums = [int(num) for num in input().split()]
print(sum(nums))
print(sum(set(nums)))

以上是关于CCF202109-1 数组推导(100分)序列处理的主要内容,如果未能解决你的问题,请参考以下文章

CSP 202109-1 数组推导 python 思维

CCF202109-2 非零段划分(100分)序列处理

CCF202109-2 非零段划分(100分)序列处理

CCF201703-1 分蛋糕(100分)序列处理

CCF202112-1 序列查询(100分)序列处理

CCF202112-1 序列查询(100分)序列处理