【美团笔试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读入 呀**!**

相关推荐
梁辰兴8 分钟前
企业培训笔记:外卖平台后端--套餐管理模块--回显套餐信息
笔记·vue·mybatis·springboot·外卖管理系统
程序员爱钓鱼13 分钟前
Python编程实战 · 基础入门篇 | 数据类型简介:数字、字符串、布尔值
后端·python
四谎真好看13 分钟前
Java 黑马程序员学习笔记(进阶篇20)
java·笔记·学习·学习笔记
聪明的笨猪猪14 分钟前
hot 100 (1)—— 两数之和(哈希)
java·经验分享·算法·哈希算法
Python图像识别40 分钟前
73_基于深度学习的水面漂浮垃圾检测系统(yolo11、yolov8、yolov5+UI界面+Python项目源码+模型+标注好的数据集)
python·深度学习·yolo
_dindong43 分钟前
牛客101:链表
数据结构·c++·笔记·学习·算法·链表
JJJJ_iii1 小时前
【机器学习06】神经网络的实现、训练与向量化
人工智能·笔记·深度学习·神经网络·学习·机器学习·线性回归
wuk9981 小时前
基于位置式PID算法调节PWM占空比实现电机转速控制
单片机·嵌入式硬件·算法
派大星爱吃猫1 小时前
堆的概念、结构与应用详解
c语言·数据结构·
mit6.8241 小时前
[tile-lang] 语言接口 | `T.prim_func` & `@tilelang.jit` | 底层原理
python