【美团笔试2024测试方向】小美的数组询问

链接:小美的数组询问__牛客网

来源:牛客网

小美的数组询问

  • 热度指数:631 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

小美拿到了一个由正整数组成的数组,但其中有一些元素是未知的(用 0 来表示)。

现在小美想知道,如果那些未知的元素在区间[l,r][l,r][l,r]范围内随机取值的话,数组所有元素之和的最小值和最大值分别是多少?

共有qqq次询问。

输入描述:
复制代码
第一行输入两个正整数n,qn,qn,q,代表数组大小和询问次数。
第二行输入nnn个整数aia_iai​,其中如果输入的aia_iai​为 0,那么说明aia_iai​是未知的。
接下来的qqq行,每行输入两个正整数 l,rl,rl,r,代表一次询问。
1≤n,q≤1051\leq n,q \leq 10^51≤n,q≤105
0≤ai≤1090 \leq a_i \leq 10^90≤ai​≤109
1≤l≤r≤1091\leq l \leq r \leq 10^91≤l≤r≤109
输出描述:
复制代码
输出qqq行,每行输出两个正整数,代表所有元素之和的最小值和最大值。

示例1:

输入

复制代码
3 2
1 0 3
1 2
4 4

输出

复制代码
5 6
8 8

说明

复制代码
只有第二个元素是未知的。
第一次询问,数组最小的和是 1+1+3=5,最大的和是 1+2+3=6。
第二次询问,显然数组的元素和必然为 8。

思路:

这个题目很简单,初始代码是:

python 复制代码
n, q = map(int, input().split())
numbers = list(map(int, input().split()))
 
cnt = numbers.count(0)
summation = sum(numbers)
 
for _ in range(q):
    l, r = map(int, input().split())
    print((summation + l * cnt), (summation + r * cnt)

看着逻辑没什么问题,但是就是死活ac不了,说编译错误,超时,自测用例也只能过8/10个

改进:

import sys

将 input() 操作换为 sys.stdin.readline() 就可以运行了。

python 复制代码
import sys
# 读取所有输入
n, q = map(int, sys.stdin.readline().split())
numbers = list(map(int, sys.stdin.readline().split()))

# 统计0的个数和总和
cnt = numbers.count(0)
summation = sum(numbers)

# 处理查询并输出结果
for _ in range(q):
    l, r = map(int, sys.stdin.readline().split())
    # 直接输出结果
    print(summation + l * cnt, summation + r * cnt)

思考:

1、说实话不太知道内部原理,问了chatgpt,解释区别如下:

input()sys.stdin.readline() 的区别

  • input() 在每次读取时会进行更多的处理,比如剥离尾部的换行符等,因此相对较慢。
  • sys.stdin.readline() 是直接从标准输入读取一整行,速度更快,特别是在处理大数据时。

2、源自csdn博主:(原文链接:https://blog.csdn.net/m0_54689021/article/details/125583075

关于input( )和sys.stdin.readline( )的区别:

sys.stdin.readline( ) 会将标准输入全部获取,包括末尾的**'\n'** ,

input() 会把**'\n'**忽略

python 复制代码
import sys
a=sys.stdin.readline()
b=input()
print(len(a),len(b))

执行效果:

abc

abc

4 3
如果在平时使用sys.stdin.readline( )获取输入的话 不要忘了去掉末尾的换行符

可以用 **sys.stdin.readline( ).strip('\n')**处理

python 复制代码
import sys
a=sys.stdin.readline().strip('\n')
b=input()
print(len(a),len(b))

执行结果:

abc

abc

3 3

值得一提的是:

sys.stdin.readline的输入速度比 input要快很多 在输入量较大的时候(10^5)

速度 甚至会快上两倍 所以大家在打算法比赛 的时候尽量 都用sys.stdin.readline读入 呀**!**

相关推荐
a程序小傲4 分钟前
字节跳动Java面试被问:Fork/Join框架的使用场景
开发语言·python
小尧嵌入式5 分钟前
C++选择排序插入排序希尔排序快排归并排及大小根堆实现优先级队列
数据结构·c++·windows·算法·排序算法
YJlio11 分钟前
磁盘工具学习笔记(13.7):分析可用空间碎片化程度——为大文件“预留整块地”
数据库·笔记·学习
老歌老听老掉牙12 分钟前
基于参数化模型的砂轮轮廓建模与可视化
python·数学建模
被遗忘的旋律.20 分钟前
Linux驱动开发笔记(十五)——MISC驱动实验
linux·驱动开发·笔记
秋邱20 分钟前
Java匿名内部类的使用场景:从语法本质到实战优化全解析
android·java·开发语言·数据库·python
吴声子夜歌21 分钟前
数据结构——二叉树
数据结构
kimi-22221 分钟前
Transformer 模型中位置编码(Positional Encoding, PE)
pytorch·python·transformer
天赐学c语言23 分钟前
12.29 - 字符串相加 && vector和map的区别
数据结构·c++·算法·leecode
m0_6896182825 分钟前
纳米工程重构生物材料:从实验室到临床的革命性突破
人工智能·笔记·学习·计算机视觉