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

相关推荐
ZSYP-S12 分钟前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring
yuanbenshidiaos19 分钟前
C++----------函数的调用机制
java·c++·算法
唐叔在学习23 分钟前
【唐叔学算法】第21天:超越比较-计数排序、桶排序与基数排序的Java实践及性能剖析
数据结构·算法·排序算法
LuH112429 分钟前
【论文阅读笔记】Learning to sample
论文阅读·笔记·图形渲染·点云
ALISHENGYA43 分钟前
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(switch语句)
数据结构·算法
chengooooooo1 小时前
代码随想录训练营第二十七天| 贪心理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和
算法·leetcode·职场和发展
黄公子学安全1 小时前
Java的基础概念(一)
java·开发语言·python
jackiendsc1 小时前
Java的垃圾回收机制介绍、工作原理、算法及分析调优
java·开发语言·算法
程序员一诺1 小时前
【Python使用】嘿马python高级进阶全体系教程第10篇:静态Web服务器-返回固定页面数据,1. 开发自己的静态Web服务器【附代码文档】
后端·python
小木_.2 小时前
【Python 图片下载器】一款专门为爬虫制作的图片下载器,多线程下载,速度快,支持续传/图片缩放/图片压缩/图片转换
爬虫·python·学习·分享·批量下载·图片下载器