Python在競賽程式設計中的輸入方法?


我們將瞭解Python在競賽程式設計中I/O方法的不同方式。在競賽程式設計中,儘可能快地讀取輸入非常重要,以便獲得優勢。

假設您正在參加Codeforces或類似的線上評判系統(如SPOJ),您必須讀取數字a、b、c、d並列印它們的乘積。有多種方法可以做到這一點,讓我們一一探索它們。

一種方法是透過列表推導和map函式。

方法1:使用列表推導

a, b, c, d = [int(x) for x in input().split()]
print(a*b*c*d)

方法2:使用map函式

a, b, c, d = map(int, input().split())
print(a*b*c*d)

另一種解決上述問題的方法是使用stdin和stdout,這要快得多。

方法1a:使用stdin和stdout的列表推導

from sys import stdin, stdout
a, b, c, d = [int(x) for x in stdin.readline().rstrip().split()]
stdout.write(str(a*b*c*d) + "\n")

讓我們來看另一個競賽程式設計問題,我們可以在這個問題上測試我們的輸入和輸出方法。這個問題在SPOJ上被稱為INTEST-巨大的輸入測試。

輸入

輸入以兩個正整數n k (n, k<=107)開頭。接下來的n行輸入包含一個正整數ti,每個數都不大於109

輸出

輸出一個整數,表示有多少個整數ti能被k整除。

其中

  • 輸入:輸入以兩個正整數n和k開頭(其中n, k <=10)。接下來的n行輸入包含一個正整數t,每個數都不大於109

  • 輸出:一個整數,表示有多少個整數t能被k整除。

例如

Input
7 3
1
51
966369
7
9
999996
11
Output
4

方法1

一種解決上述問題的方法如下,但這並不是最有效的方法。

def main():
   n, k = [int(c) for c in input().split()]
   cnt = 0
   for _ in range(n):
      t = int(input())
      if t % k == 0:
         cnt += 1
   print(cnt)

if __name__ == "__main__":
   main()

方法2

另一種更有效的方法是使用stdin和stdout。與之前的程式相比,下面的程式執行速度要快得多。

from sys import stdin, stdout

def main():
   n, k = [int(c) for c in input().split()]
   cnt = 0
   for _ in range(n):
      t = int(stdin.readline())
      if t % k == 0:
         cnt += 1
   stdout.write(str(cnt))

if __name__ == "__main__":
   main()

方法3

另一種解決上述問題的方法比前面提到的兩種方法都要快得多,它使用stdin和stdout(與方法2中使用的方法非常相似),但是,它一次讀取所有輸入並將其載入到列表中。

def main():
   for sys import stdin, stdout
   n, k = stdin.readline().split()
   n = int(n)
   k = int(k)

   cnt = 0
   lines = stdin.readlines()
   for line in lines:
      if int(line) % k == 0:
         cnt += 1
   stdout.write(str(cnt))

if __name__ == "__main__":
   main()

更新於:2019年7月30日

1000+ 次瀏覽

開啟您的職業生涯

透過完成課程獲得認證

開始
廣告
© . All rights reserved.