Trong phần này, chúng ta sẽ xem các cách khác nhau của các phương thức I / O để lập trình cạnh tranh bằng Python. Trong lập trình cạnh tranh, điều quan trọng là phải đọc đầu vào càng nhanh càng tốt để có lợi thế hơn những người khác.
Giả sử bạn đang ở trong một tổ chức mã hoặc trò chơi trực tuyến tương tự (như SPOJ) và bạn phải đọc các số a, b, c, d và in sản phẩm của họ. Có nhiều cách để thực hiện, hãy cùng khám phá chúng - từng cách một
Một cách để làm điều đó là thông qua chức năng hiểu danh sách và bản đồ.
Phương pháp 1 :Sử dụng khả năng hiểu danh sách
a, b, c, d = [int(x) for x in input().split()] print(a*b*c*d)
Phương pháp 2 :Sử dụng chức năng bản đồ
a, b, c, d = map(int, input().split()) print(a*b*c*d)
Một cách khác để giải quyết vấn đề trên là sử dụng stdin và stdout, nhanh hơn nhiều.
Phương pháp 1 a :Đọc hiểu danh sách với stdin và 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")
Chúng ta hãy xem xét một vấn đề khác từ chương trình cạnh tranh, nơi chúng ta có thể kiểm tra các phương pháp đầu vào và đầu ra của mình đối với các vấn đề. Sự cố được gọi là Kiểm tra đầu vào cực lớn INTEST trên SPOJ.
Đầu vào
Đầu vào bắt đầu bằng hai số nguyên dương n k (n, k <=10 7 ). N dòng tiếp theo của dữ liệu nhập chứa một số nguyên dương, không lớn hơn 10 9 , mỗi.
Đầu ra
Viết một số nguyên duy nhất để xuất ra, cho biết có bao nhiêu số nguyên chia hết cho k.
Ở đâu
-
ĐẦU VÀO :Đầu vào bắt đầu bằng hai số nguyên dương n và k (trong đó- n, k <=10). Các dòng đầu vào tiếp theo chứa một số nguyên dương t không lớn hơn 10 * 9 mỗi dòng.
-
ĐẦU RA :Một số nguyên duy nhất biểu thị bao nhiêu số nguyên t chia hết cho k.
Ví dụ
Input 7 3 1 51 966369 7 9 999996 11 Output 4
Phương pháp 1
Dưới đây là một cách để giải quyết vấn đề trên mặc dù không phải là cách hiệu quả
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()
Phương pháp 2
Một cách khác hiệu quả hơn để giải quyết vấn đề trên là sử dụng stdin và stdout. Chương trình bên dưới chạy nhanh hơn nhiều so với chương trình trước đó.
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()
Phương pháp 3
Một cách khác để giải quyết vấn đề trên nhanh hơn nhiều so với hai cách trước được đề cập ở trên là sử dụng stdin và stdout (rất giống với cách chúng tôi đã sử dụng trong phương pháp 2) tuy nhiên, đọc toàn bộ dữ liệu đầu vào cùng một lúc và tải nó vào danh sách.
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()