【问题标题】:How to solve this problem without using a strucure? (Getting Time Limit Exceeded)如何在不使用结构的情况下解决这个问题? (超过时限)
【发布时间】:2020-10-06 17:20:09
【问题描述】:

最近我参加了一个中学生的比赛。我遇到了这个问题,我已经研究了几个星期。问题来了:

我。呼吸机出货量

在当地医院,Gabriela 跟踪所有呼吸机的发货情况。最近,一家新工厂成立,生产呼吸机。她知道,新工厂的生产几乎非同凡响,迪某天,它生产的呼吸机与前K天生产的产品一样多。但是,医院的计算机只能处理小于 P(质数)的非负数。 Gabriela 知道前 K 天每一天的产值 Di。因此,Gabriela 想知道 N 天后生产了多少台呼吸机。如果这个数字大于或等于 P,计算机将显示生产的呼吸机数量除以 P 的余数。

输入

Line 1: Three space-separated integers N, K, P
Lines 2...K+1: A single integer Di

输出

Line 1: Number of ventilators produced after N days as displayed by the computer

示例输入:

5 2 7
1
3

输出:

6

注意:

2 ≤ N ≤ 1000000
1 ≤ K ≤ N
2 ≤ P ≤ 1000003 (where P is guaranteed to be prime)
1 ≤ Di ≤ P−1

此问题的时间限制已延长至 2000 毫秒。

我尝试了 3 种不同的方法

这是第一个:

import math

import sys
string=sys.stdin.readline()
string=string.rstrip()
arr=[0]*3
arr=string.split(' ')
n=int(arr[0])
k=int(arr[1])
p=int(arr[2])


mylist=[0]*k
for i in range (k):
  a=int(sys.stdin.readline())
  mylist[i]=a%p

product=math.prod(mylist)
for start in range (n-k):
  smallest=mylist[start%k]
  mylist[start%k]=(product%p)
  product=product*(product%p)
  product=product//smallest
sys.stdout.write (str(mylist[start%k]))

在另一种方法中,我使用了队列:


import math
from collections import deque
import sys
string=sys.stdin.readline()
string=string.rstrip()
arr=[0]*3
arr=string.split(' ')
n=int(arr[0])
k=int(arr[1])
p=int(arr[2])
q=deque()

for i in range (k):
  a=int(sys.stdin.readline())
  q.append(a%p)

product=math.prod(q)

for i in range (n-k):
  q.append(product%p)
  product=product*(product%p)
  smallest=q.popleft()
  product=product//smallest

sys.stdout.write (str(q.pop())+'\n')

但是,我在测试演员表 8 上仍然超出了时间限制。鉴于时间和空间的限制,我认为我无法使用任何类型的结构(列表、队列等)来解决这个问题。有人可以告诉我如何解决这个问题吗?

【问题讨论】:

    标签: python arrays queue


    【解决方案1】:

    问题不在于您的数据结构,而在于您的算法开销。您的第一次尝试包括每个循环中的乘法和五个除法,以及两个列表访问和四个分配。您的第二次尝试包含三个部门、三个分配和两个列表更改操作。

    您可能需要进行一些实验,以大致确定您在 2 秒内可以执行多少操作。用一个平凡的主体运行 10*6 循环迭代需要多长时间?我怀疑您将无法执行迭代解决方案。

    不要单独执行每个迭代计算,而是尝试关注给定的问题。你确实不需要每天的输出;您只需要计算 final 天的输出,以 p 为模。该生产是投入生产序列的高阶产品(生产的“种子”天数)。这些日子中的每一天在最终产品中出现了多少次?对于大n,产生值的循环是什么?最重要的是,什么因素使您的模余数为 1? (任何因素都是p-1

    计算每个因素在最终产品中出现的次数;称之为use。减少那个 mod p-1。现在你有一个表达式,例如

    product = k[0] ** (use[0] % (p-1) ) *
              k[1] ** (use[1] % (p-1) ) *
              ...
    
    print(product % p) 
    

    【讨论】:

    • 您好,非常感谢您的帮助。我想知道示例输入中有什么用处
    • 第5天的产量是1^5 * 3^3,所以use = [5, 3].
    • 好的,但是你觉得有用吗?
    • 正如我所说,我计算了每个因素在最终结果中出现的次数。这就是代数——手工计算,计算出级数,然后检查指数是如何前进的。
    猜你喜欢
    • 2019-08-08
    • 1970-01-01
    • 2023-02-25
    • 2017-05-23
    • 2010-10-15
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    相关资源
    最近更新 更多