题目链接
http://118.190.20.162/view.page?gpid=T104
题目内容
样例输入(可直接复制)
10 3 4
4 5
7 -3
10 1
1 10
4 20
5 30
7 40
代码
import sys
n, a, b = tuple(map(int,input().split()))
vector = list(map(int,sys.stdin.read().split()))
i = 0
j = 0
s = 0
while i<a and j<b:
if vector[i*2] == vector[(a+j)*2]:
s += vector[i*2+1]*vector[(a+j)*2+1]
i+=1
j+=1
elif vector[i*2] < vector[(a+j)*2]:
i+=1
else:
j+=1
print(s)
思路
这个题用 Python 开始时总是超时,得60分。通过一些小的优化没有任何效果。想到应该是在读取数据时每行读取一次花费了时间,然后想办法一次读取所有数据然后再处理。
反思
代码通过了,题目时间限制是 2s,我是 1.828s 。Python 的确有速度慢的缺点,尤其是在输入上,还有 input() 函数不是最好的方法,应该找一个其他方法代替它。
sys.stdin 提供三种读取数据的方法,通过的代码使用的是read()方法。试验了另外两种方法。
使用readline()方法,60分,超时错误,和input()是一样的。
import sys
n,a,b = list(map(int,sys.stdin.readline().split()))
vector=[]
for i in range(a):
vector.extend(sys.stdin.readline().split())
vector = list(map(int,vector))
ans = 0
j = 0
for i in range(b):
x,y =list(map(int,sys.stdin.readline().split()))
while j<len(vector) and vector[j]<x:
j+=2
if j<len(vector) and vector[j]==x:
ans+=vector[j+1]*y
j+=2
print(ans)
使用readlines()方法,情况好一些,90分,依旧是超时错误。本来想优化一下,用了map函数,没想到反而降到了60分,大概因为map函数外又使用了list函数,生成新的列表,花费了时间。
import sys
n,a,b = list(map(int,sys.stdin.readline().split()))
vector = sys.stdin.readlines()
s,i,j = 0,0,0
while i<a and j<b:
if vector[i].split()[0] == vector[(a+j)].split()[0]:
s += int(vector[i].split()[1])*int(vector[(a+j)].split()[1])
i+=1
j+=1
elif int(vector[i].split()[0]) < int(vector[(a+j)].split()[0]):
i+=1
else:
j+=1
print(s)
目前来看,read函数是最节约时间的方法。不过,对于处理读取到的数据,使用read函数时也更繁琐,容易出错。这是我在另一个题中得到的经验。结论大概就是时间限制是1s的题,一般不是考察算法,数据量不会太大,这个时候可以选择更方便的input或者readline;时间限制更大时意味着更大的数据量,应该注意时间,尽量使用read函数。