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

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

来源:牛客网

小美的数组询问

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

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

现在小美想知道,如果那些未知的元素在区间l,rl,rl,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读入 呀**!**

相关推荐
罗西的思考4 小时前
DreamZero 与 DreamDojo:世界模型与策略的分层协同综合分析与对比
人工智能·算法·机器学习
鱼子星_4 小时前
【C++】继承和多态(上)
c++·笔记
Java后端的Ai之路4 小时前
20、Python - 备忘录模式
开发语言·人工智能·python·外观模式·备忘录模式
xian_wwq4 小时前
【学习笔记】深度认知系列-第14讲 端侧AI崛起——为什么AI正在从云端走向本地
人工智能·笔记·学习
玖玥拾4 小时前
LeetCode 219 存在重复元素 II
算法·leetcode·哈希算法·散列表
2601_962077715 小时前
基于Python与NLP的新闻事件信息抽取实战:从NER到时空标准化
python·nlp·transformers·spacy·新闻事件抽取
JavaPub-rodert5 小时前
LangChain 从入门到 Agent 实战:用 Python 搭建一个真正能调用工具和知识库的 AI 助手
人工智能·python·langchain
知无不研5 小时前
c语言中循环的介绍与简单应用
c语言·开发语言·算法·循环·for·while
郝学胜-神的一滴5 小时前
Qt 高级编程 045:坐标体系深度实战
开发语言·c++·windows·python·qt·程序人生
策案案案6 小时前
YOLO: 将AI Agents嵌入到IntelliJ IDEA
java·大数据·人工智能·笔记·yolo·microsoft·intellij-idea