Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

วิธีการป้อนข้อมูล Python สำหรับการเขียนโปรแกรมการแข่งขัน?


ในที่นี้ เราจะมาดูวิธีต่างๆ ของวิธี I/O สำหรับการเขียนโปรแกรมเชิงแข่งขันใน Python ในการเขียนโปรแกรมเชิงแข่งขัน สิ่งสำคัญคือต้องอ่านข้อมูลให้เร็วที่สุดเท่าที่จะเป็นไปได้ เพื่อที่จะได้เปรียบเหนือผู้อื่น

สมมติว่าคุณอยู่ใน codeforces หรือ jude ออนไลน์ที่คล้ายกัน (เช่น SPOJ) และคุณต้องอ่านตัวเลข a, b, c, d และพิมพ์ผลิตภัณฑ์ของพวกเขา มีหลายวิธีที่จะทำ มาสำรวจกันทีละคน

วิธีหนึ่งในการทำคือผ่านรายการความเข้าใจและฟังก์ชันแผนที่

วิธีที่ 1 :การใช้ความเข้าใจรายการ

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

วิธีที่ 2 :การใช้ฟังก์ชันแผนที่

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

อีกวิธีในการแก้ไขปัญหาข้างต้นคือการใช้ stdin และ stdout ซึ่งเร็วกว่ามาก

วิธีที่ 1 :แสดงรายการความเข้าใจด้วย 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")

มาดูปัญหาอื่นจากโปรแกรมการแข่งขันกัน ซึ่งเราสามารถทดสอบวิธีการป้อนข้อมูลและเอาท์พุตของเราเกี่ยวกับปัญหาได้ ปัญหาเรียกว่า INTEST-Enormous Input Test บน SPOJ

ป้อนข้อมูล

อินพุตเริ่มต้นด้วยจำนวนเต็มบวกสองตัว nk (n, k<=10 7 ). อินพุต n บรรทัดถัดไปมีหนึ่งจำนวนเต็มบวก ti ไม่เกิน 10 9 ละ.

ผลผลิต

เขียนจำนวนเต็มเดียวไปยังเอาต์พุต แสดงว่ามีจำนวนเต็ม ti หารด้วย k ลงตัวกี่ตัว

ที่ไหน

  • อินพุต :อินพุตเริ่มต้นด้วยจำนวนเต็มบวกสองตัว n และ k (โดยที่ n, k <=10) อินพุตบรรทัดถัดไปประกอบด้วยจำนวนเต็มบวกหนึ่งจำนวน t ไม่เกิน 10*9 แต่ละจำนวน

  • ผลลัพธ์ :จำนวนเต็มเดียวที่กำหนดจำนวนเต็ม 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()