0
点赞
收藏
分享

微信扫一扫

CSP认证-202006-2 稀疏向量

题目链接

http://118.190.20.162/view.page?gpid=T104

题目内容

CSP认证-202006-2 稀疏向量_Python

CSP认证-202006-2 稀疏向量_数据_02

样例输入(可直接复制)

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函数。

举报

相关推荐

0 条评论