Tải bản đầy đủ (.pdf) (9 trang)

Đề thi Olympic Tin học quốc tế IOI năm 2014

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (621.06 KB, 9 trang )

<span class='text_page_counter'>(1)</span><div class='page_container' data-page=1>

<b>International Olympiad in Informatics 2014</b>
13-20th July 2014


Taipei, Taiwan


Day-1 tasks <sub>Language: en-VNM</sub>

<b>game</b>



<b>Trị chơi</b>



Jian-Jia là cậu bé u thích các trò chơi. Khi được yêu cầu trả lời một câu hỏi, cậu thích chơi một trị
chơi hơn thay vì trả lời trực tiếp câu hỏi đó. Jian-Jia gặp Mei-Yu và kể cho cô bạn về mạng lưới
chuyến bay ở Đài Loan. Có thành phố ở Đài Loan (được đánh số từ 0, ..., ), một số thành
phố được nối với nhau bởi các chuyến bay. Mỗi chuyến bay nối hai thành phố và có thể đi theo cả hai
chiều.


Mei-Yu hỏi Jian-Jia liệu có thể di chuyển giữa hai thành phố bất kỳ bằng máy bay (hoặc là trực tiếp
hoặc gián tiếp) hay không. Jian-Jia không muốn tiết lộ câu trả lời mà thay vì điều đó đề nghị chơi một
trị chơi. Mei-Yu có thể hỏi cậu các câu hỏi có dạng: "Giữa hai thành phố và có chuyến bay <i>trực</i>
<i>tiếp</i> hay khơng?" và Jian-Jia sẽ trả lời các câu hỏi ngay lập tức. Mei-Yu sẽ đặt câu hỏi cho mỗi cặp
thành phố đúng một lần, đưa ra tổng cộng là câu hỏi. Mei-Yu sẽ giành phần thắng
nếu sau khi nhận được câu trả lời cho câu hỏi đầu tiên , cơ có thể khẳng định được mạng có là
liên thơng hay khơng, nghĩa là có thể di chuyển giữa hai thành phố bất kỳ bằng các chuyến bay (hoặc
là trực tiếp hoặc gián tiếp). Ngược lại, nếu cơ cần hỏi tất cả câu hỏi thì người giành phần thắng là
Jian-Jia.


Để trò chơi được thú vị hơn cho Jian-Jia, hai bạn thỏa thuận với nhau rằng Jian-Jia có thể khơng sử
dụng mạng lưới chuyến bay thực tế của Đài Loan và tạo ra mạng theo diễn biến của trò chơi, lựa chọn
câu trả lời dựa trên các câu hỏi trước của Mei-Yu. Nhiệm vụ của bạn là giúp Jian-Jia giành phần
thắng của trò chơi bằng cách đưa ra những trả lời cho các câu hỏi.


<b>Ví dụ</b>




Chúng ta giải thích quy tắc của trị chơi qua ba ví dụ. Mỗi ví dụ có thành phố và lượt hỏi
và trả lời.


Trong ví dụ thứ nhất (như bảng dưới đây), Jian-Jia <i>thua</i> bởi vì sau lượt thứ 4, Mei-Yu biết chắc chắn
rằng có thể di chuyển giữa hai thành phố bất kỳ bằng các chuyến bay, không cần đến câu trả lời cho
câu hỏi thứ 5 hoặc thứ 6.


<b>Lượt Câu hỏi Trả lời</b>


1 0, 1 yes


2 3, 0 yes


3 1, 2 no


4 0, 2 yes


--- ---


---5 3, 1 no


6 2, 3 no


</div>
<span class='text_page_counter'>(2)</span><div class='page_container' data-page=2>

chuyến bay sau lượt thứ 3, không cần đến câu trả lời cho câu hỏi thứ 4, 5 hoặc 6 của Jian-Jia, do đó
Jian-Jia lại thua.


<b>Lượt Câu hỏi Trả lời</b>


1 0, 3 no



2 2, 0 no


3 0, 1 no


--- ---


---4 1, 2 yes


5 1, 3 yes


6 2, 3 yes


Trong ví dụ cuối cùng, Mei-Yu khơng thể xác định liệu có cách di chuyển giữa hai thành phố bất kỳ
bằng các chuyến bay trước khi tất cả sáu câu hỏi đều được trả lời, do đó Jian-Jia giành <i>phần thắng</i>.
Cụ thể, bởi vì Jian-Jia đã trả lời <i>yes</i> cho câu hỏi cuối cùng (trong bảng dưới đây), khi đó có thể di
chuyển giữa hai thành phố bất kỳ. Tuy nhiên, nếu Jian-Jia trả lời <i>no</i> cho câu hỏi cuối cùng thì điều đó
là khơng thể.


<b>Lượt Câu hỏi Trả lời</b>


1 0, 3 no


2 1, 0 yes


3 0, 2 no


4 3, 1 yes


5 1, 2 no



6 2, 3 yes


<b>Nhiệm vụ</b>



Bạn hãy viết chương trình giúp Jian-Jia giành phần thắng trong trị chơi. Chú ý rằng đối với cả Mei-Yu
lẫn Jian-Jia, người này không biết chiến lược chơi của người kia và ngược lại. Mei-Yu có thể hỏi các
cặp thành phố theo thứ tự bất kỳ và Jian-Jia phải trả lời ngay lập tức, không được biết các câu sắp hỏi.
Bạn cần cài đặt hai sau.


initialize(n) -- Hàm initialize sẽ được gọi đầu tiên. Tham số là số lượng thành phố.


hasEdge(u, v) -- sau đó hàm hasEdge sẽ được gọi lần. Các lần gọi này
thể hiện cho các câu hỏi của Mei-Yu theo thứ tự mà cô ta thực hiện. Bạn phải trả lời có hay
khơng có chuyến bay trực tiếp giữa hai thành phố và . Cụ thể, giá trị trả về phải là 1 nếu có
chuyến bay trực tiếp, hay là 0 trong trường hợp ngược lại.


<b>Subtasks</b>



</div>
<span class='text_page_counter'>(3)</span><div class='page_container' data-page=3>

<b>subtask points</b>


1 15


2 27


3 58


<b>Chi tiết cài đặt</b>



Bạn phải nộp đúng một file được đặt tên game.c, game.cpp hoặc game.pas. File này cài đặt


chương trình con như mô tả ở trên sử dụng các đặc tả dưới đây.


<b>C/C++ programs</b>



void initialize(int n);
int hasEdge(int u, int v);


<b>Pascal programs</b>



procedure initialize(n: longint);


function hasEdge(u, v: longint): longint;


<b>Sample grader</b>



Sample grader đọc dữ liệu vào theo khn dạng sau:
Dịng 1: n


</div>
<span class='text_page_counter'>(4)</span><div class='page_container' data-page=4>

<b>International Olympiad in Informatics 2014</b>
13-20th July 2014


Taipei, Taiwan


Day-1 tasks <sub>Language: en-VNM</sub>

<b>rail</b>



<b>Đường tàu</b>



Đài Loan có một hệ thống đường tàu lớn nối hai bờ đơng và tây của hịn đảo. Hệ thống đường tàu có
khối. Các khối nằm liên tiếp cạnh nhau được đánh số thứ tự , bắt đầu từ đầu bờ phía
tây. Mỗi một khối gồm hai tuyến đường một chiều: tuyến đường ở phía bắc đi về hướng tây, tuyến


đường ở phía nam đi về hướng đơng; trong mỗi khối cịn có thể có một ga tàu nằm giữa hai tuyến
đường này.


Các khối được chia thành ba loại. Khối loại <i>C</i> chứa một ga tàu mà bạn phải đi vào từ tuyến đường
nằm ở phía bắc và thốt ra tuyến đường nằm ở phía nam, khối loại <i>D</i> chứa một ga tàu mà bạn phải đi
vào từ tuyến đường nằm ở phía nam và thốt ra tuyến đường nằm ở phía bắc, khối loại <i>trống</i> khơng
chứa ga tàu nào. Ví dụ, trong hình vẽ dưới đây, khối 0, 4 và 6 thuộc loại trống, khối 1, 2 và 3 thuộc loại
C, và khối 5 thuộc loại D. Các khối nối với nhau theo chiều ngang. Các tuyến tương ứng của hai khối
liền kề được thông với nhau bởi các <i>điểm nối</i>, được minh hoạ bởi các hình chữ nhật tơ mờ trong hình
vẽ dưới đây.


Hệ thống đường tàu có ga tàu được đánh số từ 0 đến . Có thể giả thiết rằng <i>ta có thể đi từ</i>
<i>bất kỳ một ga tàu này đến một ga tàu khác</i> bằng cách đi theo tuyến đường. Ví dụ ta có thể đi từ ga
tàu 0 đến ga tàu 2 bằng cách xuất phát từ khối 2, rồi đi qua khối 3 và 4 sử dụng tuyến đường nằm ở
phía nam, và đi qua khối 5 qua ga tàu 1, sau đó đi qua khối 4 sử dụng tuyến đường nằm ở phía bắc, và
cuối cùng đến ga tàu 2 nằm ở khối 3.


Vì có thể có nhiều đường đi giữa hai ga tàu, khoảng cách từ một ga tàu đến một ga tàu khác được
định nghĩa là số lượng <i>nhỏ nhất</i> các điểm nối mà đường đi phải đi qua. Ví dụ, đường đi ngắn nhất từ
ga tàu 0 đến ga tàu 2 đi qua khối 2-3-4-5-4-3 và đi qua 5 điểm nối, vì vậy có khoảng cách là 5.
Hệ thống đường tàu được quản lý bởi một hệ thống máy tính. Khơng may, sau một sự cố mất điện,
máy tính bị mất thông tin các ga tàu nằm ở đâu và khối chứa ga tàu đó thuộc loại nào. Manh mối duy
nhất mà hệ thống máy tính cịn giữ được là số thứ tự của khối chứa ga tàu 0, và khối này luôn thuộc
loại C. May mắn là hệ thống máy tính vẫn có thể thực hiện truy vấn tính khoảng cách từ một ga tàu
bất kỳ này đến một ga tàu bất kỳ khác. Ví dụ, hệ thống máy tính có thể thực hiện truy vấn 'khoảng
cách từ ga tàu 0 đến ga tàu 2 là bao nhiêu?' và nó sẽ trả về giá trị 5.


<b>Nhiệm vụ</b>



</div>
<span class='text_page_counter'>(5)</span><div class='page_container' data-page=5>

findLocation(n, first, location, stype)


n: số lượng các ga tàu.


first: Số thứ tự khối chứa ga tàu 0.


location: mảng có độ dài ; bạn cần gán giá trị số thứ tự của khối chứa ga tàu cho


location[i].


stype: mảng có độ dài ; bạn cần gán loại khối của ga tàu cho stype[i]: 1 cho loại C và 2
cho loại D.


Bạn có thể gọi hàm getDistance để giúp bạn xác định vị trí và loại khối của các ga tàu.


getDistance(i, j) trả về khoảng cách từ ga tàu i đến ga tàu j. getDistance(i, i) sẽ
trả về 0. getDistance(i, j) sẽ trả về -1 nếu i hoặc j nằm ngoài khoảng


.


<b>Subtasks</b>



Trong tất cả các subtasks, số lượng các khối không lớn hơn 1,000,000. Trong một vài subtasks số
lượt gọi hàm getDistance bị hạn chế. Hạn chế này thay đổi theo subtasks. Chương trình của bạn sẽ
được đánh giá 'wrong answer' nếu nó sử dụng quá giới hạn này.


<b>subtask điểm</b> <b>số lần gọi</b>


<b>getDistance</b> <b>ghi chú</b>


1 8 không hạn



chế


Tất cả ga tàu, trừ ga tàu 0, đều nằm ở khối
thuộc loại D.


2 22 không hạn<sub>chế</sub>


Tất cả ga tàu phía đơng của ga tàu 0 nằm ở
khối thuộc loại D, và tất cả ga tàu phía tây của
ga tàu 0 nằm ở khối thuộc loại C.


3 26 khơng có thêm hạn chế nào


4 44 khơng có thêm hạn chế nào


<b>Chi tiết cài đặt</b>



Bạn phải nộp duy nhất một file, được đặt tên là rail.c, rail.cpp hoặc rail.pas. File này cài đặt


findLocation như đã được mô tả ở trên sử dụng các đặc tả sau đây. Bạn cũng cần phải nạp
header file rail.h khi sử dụng C/C++.


<b>C/C++ program</b>



void findLocation(int n, int first, int location[], int stype[]);


<b>Pascal program</b>



</div>
<span class='text_page_counter'>(6)</span><div class='page_container' data-page=6>

stype : array of longint);



Khuôn dạng của getDistance được mô tả như sau.


<b>C/C++ program</b>



int getDistance(int i, int j);


<b>Pascal program</b>



function getDistance(i, j: longint): longint;


<b>Sample grader</b>



Sample grader đọc dữ liệu vào theo khn dạng sau:
dịng 1: số thứ tự subtask


dịng 2: n


dòng , ( ): stype[i] (1 cho loại C và 2 cho loại D), location[i].
Sample grader sẽ in ra Correct nếu location[0] ... location[n-1] và stype[0] ...


</div>
<span class='text_page_counter'>(7)</span><div class='page_container' data-page=7>

<b>International Olympiad in Informatics 2014</b>
13-20th July 2014


Taipei, Taiwan


Day-1 tasks <sub>Language: en-VNM</sub>

<b>wall</b>



<b>Bức tường</b>



Jian-Jia đang xây dựng bức tường bằng cách xếp các viên gạch có cùng kích thước. Bức tường bao


gồm cột gạch, được đánh số từ 0 đến từ trái qua phải. Các cột có thể có độ cao khác nhau.
Độ cao của một cột là số viên gạch trên nó.


Jian-Jia xây dựng bức tường theo cách sau. Thoạt tiên, khơng có viên gạch nào trên mỗi cột. Sau đó,
Jian-Jia thực hiện giai đoạn <i>thêm</i> hoặc <i>bớt</i> các viên gạch. Quá trình xây dựng sẽ chấm dứt khi tất cả


giai đoạn được hoàn thành. Trong mỗi giai đoạn, Jian-Jia được cho biết một dãy các cột gạch liên
tiếp và chiều cao , và nó cần thực hiện thủ tục sau đây:


Trong giai đoạn <i>thêm</i>, Jian-Jia thêm các viên gạch vào các cột trong dãy cột đã cho mà có ít
hơn viên gạch sao cho chúng chứa đúng viên gạch. Jian-Jia khơng làm gì với những cột có
nhiều hơn hoặc bằng viên gạch.


Trong giai đoạn <i>bớt</i>, Jian-Jia loại bớt các viên gạch từ các cột trong dãy cột đã cho mà chứa
nhiều hơn viên gạch, sao cho chúng chứa đúng viên gạch. Jian-Jia khơng làm gì với những
cột có ít hơn hoặc bằng viên gạch.


Nhiệm vụ của bạn là xác định hình dạng cuối cùng của bức tường.

<b>Ví dụ</b>



Giả sử là có 10 cột gạch và 6 giai đoạn xây dựng tường. Các dãy cột trong bảng sau đây là kể cả hai
cột đầu mút. Sơ đồ của bức tường sau mỗi giai đoạn được mơ tả ở phía dưới.


<b>giai đoạn kiểu</b> <b>dãy cột</b> <b>chiều cao</b>


0 thêm từ cột 1 đến 8 4
1 bớt từ cột 4 đến 9 1
2 bớt từ cột 3 đến 6 5
3 thêm từ cột 0 đến 5 3



4 thêm cột 2 5


5 bớt từ cột 6 đến 7 0


</div>
<span class='text_page_counter'>(8)</span><div class='page_container' data-page=8>

<b>Nhiệm vụ</b>



Cho mô tả của giai đoạn, hãy tính số lượng gạch trong mỗi cột sau khi thực hiện xong tất cả các giai
đoạn. Bạn cần cài đặt hàm buildWall.


buildWall(n, k, op, left, right, height, finalHeight)
n: số lượng cột trong bức tường.


k: số lượng giai đoạn.


op: mảng độ dài ; op[i] là kiểu của giai đoạn : 1 nếu là giai đoạn thêm và 2 nếu là gia


đoạn bớt, với .


left và right: các mảng độ dài ; cho biết dãy cột trong giai đoạn bắt đầu từ cột


left[i] và kết thúc ở cột right[i] (kể cả hai cột ở hai đầu mút left[i] và


right[i]), với . Giả thiết ln có left[i] right[i].


height: mảng độ dài ; height[i] là thông số chiều cao trong giai đoạn , với
.


</div>
<span class='text_page_counter'>(9)</span><div class='page_container' data-page=9>

<b>Subtasks</b>



Trong mọi subtasks chiều cao trong mọi giai đoạn là số nguyên không âm nhỏ hơn hoặc bằng


.


<b>subtask điểm</b> <b>chú thích</b>


1 8 khơng có giới hạn bổ sung


2 24 tất cả các giai đoạn thêm xuất hiện


trước mọi giai đoạn bớt


3 29 khơng có giới hạn bổ sung


4 39 khơng có giới hạn bổ sung


<b>Chi tiết cài đặt</b>



Bạn cần nộp đúng một file được đặt tên là wall.c, wall.cpp hay wall.pas. File này chứa cài đặt
chương trình con mơ tả ở trên sử dụng các đặc tả sau đây. Bạn cần nạp header file wall.h đối với
chương trình C/C++.


<b>C/C++ program</b>



void buildWall(int n, int k, int op[], int left[], int right[],
int height[], int finalHeight[]);


<b>Pascal program</b>



procedure buildWall(n, k : longint; op, left, right, height :
array of longint; var finalHeight : array of longint);



<b>Sample grader</b>



Sample grader đọc dữ liệu vào theo khuôn dạng sau:
dòng 1: n, k.


</div>

<!--links-->

×