Hướng dẫn làm dạng bài interactive


Đối với dạng bài tập này, dữ liệu đầu vào từ chương trình có thể không được xác định trước nhưng được sinh đặc biệt cho bài làm của bạn. Khi chấm bài, trình chấm sẽ sử dụng một chương trình đặc biệt - interactor - để chuyển dữ liệu đầu ra tới đầu vào của chương trình do bạn cung cấp, và tiếp tục lấy dữ liệu đầu ra từ chương trình của bạn chuyển vào đầu vào của interactor. Nói cách khác, bài làm của bạn và interactor sẽ trao đổi dữ liệu cho nhau và lựa chọn in ra những gì được lấy từ “lịch sử trao đổi”.

Khi bạn viết lời giải cho dạng bài interactive, điều quan trọng nhất mà bạn phải nhớ chính là: nếu bạn xuất dữ liệu ra đầu ra, có khả năng các dữ liệu đó sẽ được đưa vào bộ nhớ đệm nội bộ (internal buffer) và không được truyền trực tiếp tới interactor. Để tránh xảy ra hiện tượng này, chúng ta sẽ sử dụng một lệnh đặc biệt flush bất cứ khi nào bạn in ra một cái gì đó. Lệnh flush này được đi kèm trong thư viện chuẩn của hầu hết các ngôn ngữ lập trình. Ví dụ, đối với C++, bạn có thể dùng fflush(stdout) hoặc cout << flush (phụ thuộc vào cách bạn nhập xuất dữ liệu - bằng scanf/printf hoặc cout). Trong Java, bạn có thể dùng lệnh flush bằng System.out.flush(). Trong Python, ta có thể dùng stdout.flush(). Trong Pascal, chúng ta có flush(output).

Có một số ghi chú đối với dạng bài interactive:

  • Đầu vào/ra trong các bài tập dang interactive thường chậm hơn khá nhiều so với các bài tập thông thường - nên sử dụng scanf/printf thay vì cin/cout đối với C++.
  • Thông thường, việc tự chấm thử bài làm đối với các bài tập dang interactive thường sẽ phức tạp hơn nhiều, bởi thí sinh sẽ phải đóng vai trò là interactor trong quá trình chấm thử.
  • Trong C++, endl sẽ thực hiện flush một cách tự động.

Bài tập mẫu: guessthenumber

Xem thêm về interactive ở: codeforces