trang chủ / bài tập / pickhero

Chọn Tướng

Đề bài

Mô tả

Có hai đội, mỗi đội gồm n người chơi, và tổng cộng 2n vị tướng cần được chia cho hai đội. Hai đội lần lượt chọn tướng: đầu tiên đội 1 chọn một tướng, sau đó đội 2 chọn, rồi lại đến đội 1, và cứ thế xen kẽ. Mỗi tướng sau khi được chọn sẽ không còn để đội nào chọn nữa. Sau 2n lượt, mỗi đội có đúng n tướng.

Sức mạnh của tướng thứ ipi. Mỗi đội muốn tối đa hoá tổng sức mạnh các tướng của đội mình.

Ngoài ra có m cặp khắc chế: khi một đội chọn một tướng thuộc một cặp khắc chế thì ngay ở lượt kế tiếp, đội kia buộc phải chọn tướng còn lại của cặp đó. Mỗi tướng thuộc nhiều nhất một cặp khắc chế.

Bạn điều khiển đội t. Chương trình chấm sẽ điều khiển đội còn lại và có thể chơi không tối ưu; trong trường hợp đó bạn phải tận dụng để đạt tổng sức mạnh lớn nhất có thể. Nói chính xác: nếu tồn tại một chiến lược bảo đảm cho bạn đạt tổng sức mạnh ít nhất là q bất kể đội kia chọn thế nào, thì bạn phải đạt được ít nhất q.

Dữ liệu vào

  • Dòng đầu chứa hai số nguyên nm.
  • Dòng thứ hai chứa 2n số nguyên p1,p2,,p2n.
  • m dòng tiếp theo, mỗi dòng chứa hai số nguyên ab (ab) mô tả một cặp khắc chế. Mỗi tướng xuất hiện nhiều nhất một lần trong danh sách này.
  • Dòng cuối chứa số nguyên t (đội mà bạn điều khiển).

Các tướng được đánh số từ 1 đến 2n theo thứ tự trong dữ liệu vào.

Dữ liệu ra

Đây là bài toán tương tác. Bạn không đọc trọn dữ liệu một lần rồi in kết quả, mà trao đổi qua lại với hệ thống theo giao thức bên dưới.

Giao thức tương tác

Trò chơi diễn ra trong 2n lượt. Ở mỗi lượt của bạn, in ra một số nguyên x (1x2n) là chỉ số tướng bạn chọn. Tướng này phải chưa được chọn và phải tuân thủ luật cặp khắc chế (nếu bạn đang bị buộc phải chọn tướng còn lại của một cặp thì bắt buộc chọn đúng tướng đó).

Ở mỗi lượt của đội kia, đọc một số nguyên x (1x2n) là chỉ số tướng mà đội kia chọn.

Nếu t=1 bạn đi trước, ngược lại bạn đi sau. Sau lượt cuối cùng, kết thúc chương trình mà không in gì thêm.

Quan trọng: Sau mỗi lần in ra, bạn phải flush output:

  • C++: cout << endl; hoặc cout.flush();
  • Python: print(..., flush=True)

Nếu bạn thực hiện một lượt không hợp lệ, hệ thống sẽ kết thúc và bạn nhận kết quả sai.

Ràng buộc

  • 1n1000
  • 0mn
  • 1pi1000
  • Bảo đảm mỗi tướng thuộc nhiều nhất một cặp khắc chế.

Ví dụ

Chương trình Hệ thống Giải thích
3 1
1 2 3 4 5 6
2 6
1
Đọc dữ liệu: n=3, m=1, cặp khắc chế (2,6), bạn là đội 1.
6 Bạn chọn tướng 6 (mạnh nhất, sức mạnh 6); vì 6 thuộc cặp (2,6) nên đội kia bị buộc chọn 2.
2 Đội kia buộc phải chọn tướng 2.
5 Bạn chọn tướng 5.
4 Đội kia chọn tướng 4.
3 Bạn chọn tướng 3.
1 Đội kia chọn tướng 1. Tổng của bạn là 6+5+3=14.
Chương trình Hệ thống Giải thích
3 1
1 2 3 4 5 6
1 5
2
n=3, m=1, cặp khắc chế (1,5), bạn là đội 2.
6 Đội kia đi trước, chọn tướng 6.
5 Bạn chọn tướng 5; vì 5 thuộc cặp (1,5) nên đội kia bị buộc chọn 1.
1 Đội kia buộc phải chọn tướng 1.
4 Bạn chọn tướng 4.
3 Đội kia chọn tướng 3.
2 Bạn chọn tướng 2. Tổng của bạn là 5+4+2=11.

Bình luận

Không có bình luận tại thời điểm này.

gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.46 awk 1.3.4 gcc 16.1.0 csc 6.12.0.200 g++ 16.1.0 g++-themis 16.1.0 g++17 16.1.0 g++20 16.1.0 g++23 16.1.0 clang++ 22.1.6 dmd 2.112.0 dart 3.12.1 gforth 0.7.3 gfortran 12.2.0 go 1.26.3 groovyc 5.0.6 javac 25.0.3 node 26.2.0 kotlinc 2.3.21 sbcl 2.2.9 lua 5.4.8 nim 2.2.10 fpc 3.2.2 fpc-themis 3.2.2 perl 5.36.0 php 8.5.6 pike 8.0 pypy3 7.3.23 python3 3.14.5 racket 8.7 ruby 4.0.5 rustc 1.96.0 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 tclsh 8.6 bun 1.3.14 deno 2.8.1 v 0.5.1 zig 0.16.0