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

相关推荐
Wx120不知道取啥名16 分钟前
C语言之长整型有符号数与短整型有符号数转换
c语言·开发语言·单片机·mcu·算法·1024程序员节
测试老哥44 分钟前
Python+Selenium+Pytest+POM自动化测试框架封装(完整版)
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
Iareges1 小时前
美团2025校招 广告算法工程师 面经
算法·面试·求职招聘·笔试·秋招
Ws_1 小时前
蓝桥杯 python day01 第一题
开发语言·python·蓝桥杯
神雕大侠mu2 小时前
函数式接口与回调函数实践
开发语言·python
IT规划师2 小时前
数据结构 - 散列表,三探之代码实现
数据结构·散列表·哈希表
堇舟2 小时前
斯皮尔曼相关(Spearman correlation)系数
人工智能·算法·机器学习
TT哇3 小时前
【Java】数组的定义与使用
java·开发语言·笔记
萧鼎3 小时前
【Python】高效数据处理:使用Dask处理大规模数据
开发语言·python
西几3 小时前
代码训练营 day48|LeetCode 300,LeetCode 674,LeetCode 718
c++·算法·leetcode