【发布时间】:2020-04-16 03:02:05
【问题描述】:
我正在尝试解决一个竞赛问题:https://dmoj.ca/problem/ccc18s2。 基本上你会得到一个输入,第一行给出输入的行数,然后你会得到一系列整数(最大值:10^9)。 样本输入:
3
4 3 1
6 5 2
9 7 3
然后程序必须旋转这个网格,直到每列的第一个元素小于每列的第二个元素,依此类推。每行也必须按升序排列。
样本输出:
1 2 3
3 5 7
4 6 9
import sys
n = int(sys.stdin.readline())
row=[]
appendtorow = row.append
for i in range(0,n):
inputx = (sys.stdin.readline()).rstrip()
inp = inputx.split(" ")
appendtorow(inp)
def rotate(row):
new =[]
for i in range(0,n):
temp=[]
for j in range(0,n):
temp.append(row[n-1-j][i])
new.append(temp)
return new
def printout():
for i in range(0,n):
for j in range(0,n):
x=row[i]
y=x[j]
sys.stdout.write(y)
sys.stdout.write(" ")
sys.stdout.write("\n")
def check(row):
m=False
g=False
f=False
for i in range(0,n):
for j in range(0,n-1):
if(row[n-1][i]>row[n-1-j][i]):
m=True
for i in range(0,n):
for j in range(0,n-1):
if(row[i][0]<row[i][j+1]):
g=True
if(g==True and m==True):
f=True
return f
flag=0
while(flag==0):
g=check(row)
if(g==True):
printout()
flag=1
else:
row = rotate(row)
按照本指南的建议,我尝试使用标准输入、标准输出和将追加移出循环来提高它的速度:https://wiki.python.org/moin/PythonSpeed/PerformanceTips。但是该程序需要时间限制(1s)的两倍时间(2s),这些似乎没有帮助。
我该如何优化呢? 调用函数会增加程序执行的时间吗?
【问题讨论】:
-
row 对于您的二维数组来说似乎是一个坏名字。但是,您可以在一行中旋转:rotate = zip(*row[::-1]) Source
-
1) 追加到列表非常慢,如果允许,请使用固定大小的数组; 2)尝试移位和减去列表,然后检查新列表(或更好的数组)的所有元素是否低于/高于零,而不是比较两个列表的每个元素(一个具有不同索引的列表)
-
在检查程序中,如果条件不满足,您应该尽早跳出双循环。
标签: python python-3.x optimization