Tải bản đầy đủ (.pdf) (10 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 (821.21 KB, 10 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-2 tasks <sub>Language: en-VNM</sub>

<b>friend</b>



<b>Bạn bè</b>



Chúng ta xây dựng mạng xã hội gồm thành viên được đánh số là 0, ... , . Có một số cặp thành
viên trong mạng sẽ là bạn bè. Nếu thành viên trở thành bạn của thành viên , thì thành viên cũng
sẽ là bạn của thành viên .


Các thành viên được bổ sung vào mạng theo giai đoạn, cũng được đánh số từ đến . Thành
viên được bổ sung ở giai đoạn . Ở giai đoạn 0, thành viên 0 được bổ sung như là thành viên duy
nhất của mạng. Trong mỗi giai đoạn thuộc giai đoạn tiếp theo, thành viên được bổ sung vào
mạng bởi người giới thiệu, là một thành viên bất kỳ của mạng hiện thời. Tại giai đoạn ( ),
người giới thiệu của giai đoạn này có thể bổ sung thành viên vào mạng theo một trong ba cách thức
sau:


<i>IAmYourFriend gắn thành viên là bạn của duy nhất người giới thiệu.</i>


<i>MyFriendsAreYourFriends gắn thành viên là bạn với bất cứ người bạn nào của người giới</i>
thiệu tại thời điểm này. Chú ý là, cách thức này không gắn thành viên là bạn của người giới
thiệu.


<i>WeAreYourFriends gắn thành viên là bạn của người giới thiệu và cũng là bạn của bất cứ</i>
người bạn nào của người giới thiệu tại thời điểm này.


Sau khi xây dựng xong mạng chúng ta muốn xác định một mẫu thử để điều tra, nghĩa là cần chọn ra
một nhóm thành viên của mạng. Do các người bạn bè thường có những mối quan tâm tương tự nhau,


nên mẫu thử phải không được chứa cặp hai thành viên là bạn bè của nhau. Mỗi thành viên có một độ
<i>tự tin, được đánh giá bởi một số nguyên dương, và chúng ta muốn tìm mẫu thử với tổng độ tự tin là lớn</i>
nhất.


<b>Ví dụ</b>



<b>giai đoạn người giới thiệu</b> <b>cách thức</b> <b>quan hệ bạn bè được bổ sung</b>


1 0 IAmYourFriend (1, 0)


2 0 MyFriendsAreYourFriends (2, 1)


3 1 WeAreYourFriends (3, 1), (3, 0), (3, 2)
4 2 MyFriendsAreYourFriends (4, 1), (4, 3)


5 0 IAmYourFriend (5, 0)


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

2 / 3
bạn của người giới thiệu). Kết quả của giai đoạn 4 và 5 cũng được mô tả trong bảng ở trên. Mạng kết
quả cuối cùng được chỉ ra trong hình vẽ sau đây, trong đó các số trong vịng trịn là chỉ số của thành
viên còn các số bên cạnh các vòng tròn là độ tự tin. Mẫu thử gồm hai thành viên 3 và 5 có tổng độ tự
tin bằng 20 + 15 = 35, là mẫu có tổng độ tự tin lớn nhất có thể.


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



Cho biết mơ tả của mỗi giai đoạn và độ tự tin của mỗi thành viên, hãy xác định mẫu thử với tổng độ tự
tin lớn nhất. Bạn chỉ phải cài đặt hàm findSample.


findSample(n, confidence, host, protocol)
n: số lượng thành viên.



confidence: mảng độ dài ; confidence[i] chứa độ tự tin của thành viên .
host: mảng độ dài ; host[i] chứa chỉ số của người giới thiệu ở giai đoạn .


protocol: mảng độ dài ; protocol[i] chứa cách thức được sử dụng ở giai đoạn (
): 0 là IAmYourFriend, 1 là MyFriendsAreYourFriends, và 2 là


WeAreYourFriends.


Do khơng có người giới thiệu ở giai đoạn 0, host[0] và protocol[0] là không xác định
và chương trình của bạn khơng được truy nhập đến chúng.


Hàm phải trả lại tổng độ tự tin lớn nhất của mẫu thử.

<b>Subtasks</b>



Một số subtasks chỉ sử dụng một bộ phận các cách thức có thể, như được mơ tả trong bảng sau đây.


<b>subtask điểm</b> <b>độ tự tin</b> <b>các cách thức được dùng</b>


1 11 tất cả các cách thức


2 8 chỉ dùng


MyFriendsAreYourFriends


3 8 chỉ dùng WeAreYourFriends


4 19 chỉ dùng IAmYourFriend


5 23 Tất cả các độ tự tin đều là 1 DùngMyFriendsAreYourFriends và


IAmYourFriend


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

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



Bạn cần nộp một file duy nhất đặt tên là friend.c, friend.cpp hay friend.pas. File này 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 friend.h đối với
cài đặt trên C/C++.


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



int findSample(int n, int confidence[], int host[], int protocol[]);


<b>Pascal programs</b>



function findSample(n: longint, confidence: array of longint, host: array
of longint; protocol: array of longint): longint;


<b>Sample grader</b>



Sample grader đọc dữ liệu vào theo khuôn dạng:
line 1: n


line 2: confidence[0], ..., confidence[n-1]


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

1 / 4
<b>International Olympiad in Informatics 2014</b>


13-20th July 2014
Taipei, Taiwan



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

<b>gondola</b>



<b>Thuyền Gondola</b>



Mao-Kong Gondola là một địa điểm du lịch nổi tiếng ở Đài Bắc. Hệ thống thuyền gondola gồm một
đường ray vòng tròn, một bến đỗ duy nhất, và thuyền gondola được gắn chỉ số là các số liên tiếp từ
1 đến chạy vòng quanh đường ray theo một hướng cố định. Sau khi chiếc thuyền gondola đi qua
bến đỗ, chiếc tiếp theo sẽ đi qua bến đỗ là chiếc gondola nếu , hoặc chiếc gondola 1 nếu


.


Các thuyền gondola có thể bị hỏng. May mắn là chúng ta có một số lượng khơng hạn chế các thuyền
gondola dự trữ được đánh số , , v.v. Khi một chiếc thuyền gondola bị hỏng, nó sẽ được
thay thế (ở đúng vị trí của nó ở trên đường ray) bằng chiếc thuyền dự trữ đầu tiên, cụ thể là chiếc
thuyền dự trữ có chỉ số nhỏ nhất. Ví dụ, nếu có năm chiếc thuyền gondola và chiếc gondola 1 bị hỏng
thì ta sẽ thay nó bằng chiếc gondola 6.


Bạn thích thú với việc đứng ở bến đỗ và ngắm các thuyền gondola đi qua bến đỗ. Một dãy thuyền
<i>gondola là một dãy số là chỉ số của các thuyền gondola đi qua bến đỗ. Có thể xảy ra trường hợp</i>
một hoặc nhiều chiếc thuyền gondola bị hỏng (và được thay thế) trước khi bạn đến, nhưng khơng có
chiếc gondola nào bị hỏng trong thời gian bạn đứng ngắm tại bến đỗ.


Lưu ý rằng cùng một cấu hình của các thuyền gondola trên đường ray có thể cho ra nhiều dãy thuyền
gondola, tuỳ thuộc vào việc khi bạn có mặt ở bến đỗ thì chiếc gondola nào là chiếc đầu tiên đi qua bến
đỗ. Ví dụ nếu khơng có chiếc gondola nào bị hỏng thì cả (2, 3, 4, 5, 1) và (4, 5, 1, 2, 3) là các dãy
thuyền gondola có thể, nhưng (4, 3, 2, 5, 1) thì khơng phải (vì các chiếc gondola xuất hiện sai thứ tự).
Nếu chiếc gondola 1 bị hỏng, thì ta có thể quan sát thấy dãy thuyền gondola (4, 5, 6, 2, 3). Nếu tiếp
theo chiếc gondola 4 bị hỏng, ta thay nó bởi chiếc gondola 7 và ta có thể quan sát thấy dãy thuyền
gondola (6, 2, 3, 7, 5). Nếu sau đó chiếc gondola 7 bị hỏng, ta thay nó bởi chiếc gondola 8 và ta có thể
quan sát thấy dãy thuyền gondola (3, 8, 5, 6, 2).



<b>gondola bị hỏng gondola thay thế dãy thuyền gondola có thể</b>


1 6 (4, 5, 6, 2, 3)


4 7 (6, 2, 3, 7, 5)


7 8 (3, 8, 5, 6, 2)


Một dãy thay thế là một dãy số gồm chỉ số các thuyền gondola bị hỏng, theo thứ tự mà chúng bị hỏng.
Ở ví dụ trên, dãy thay thế là (1, 4, 7). Một dãy thay thế tạo ra một dãy thuyền gondola nếu sau khi
các chiếc gondola bị hỏng theo dãy thay thế , dãy thuyền gondola có thể được quan sát thấy.

<b>Kiểm tra dãy thuyền Gondola</b>



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

valid(n, inputSeq)


n: độ dài của dãy đầu vào.


inputSeq: mảng có độ dài ; inputSeq[i] là phần tử thứ của dãy đầu vào với
.


Hàm phải trả về giá trị 1 nếu dãy đầu vào là một dãy thuyền gondola, hoặc 0 trong trường
hợp ngược lại.


<b>Subtasks 1, 2, 3</b>



<b>subtask điểm</b> <b>inputSeq</b>


1 5 mỗi số trong khoảng từ 1 to xuất hiện đúng một lần



2 5 <sub>inputSeq[i]</sub>


3 10 <sub>inputSeq[i]</sub>


<b>Ví dụ</b>



<b>subtask</b> <b>inputSeq</b> <b>giá trị trả về</b> <b>ghi chú</b>


1 (1, 2, 3, 4, 5, 6, 7) 1
1 (3, 4, 5, 6, 1, 2) 1


1 (1, 5, 3, 4, 2, 7, 6) 0 1 không thể xuất hiện ngay trước 5
1 (4, 3, 2, 1) 0 4 không thể xuất hiện ngay trước 3
2 (1, 2, 3, 4, 5, 6, 5) 0 hai chiếc gondola có cùng chỉ số 5
3 (2, 3, 4, 9, 6, 7, 1) 1 dãy thay thế (5, 8)


3 (10, 4, 3, 11, 12) 0 4 không thể xuất hiện ngay trước 3

<b>Dãy thay thế</b>



Trong ba subtask tiếp theo, bạn phải xây dựng một dãy thay thế mà tạo ra một dãy thuyền gondola cho
trước. Bất kỳ dãy thay thế nào thoả mãn điều kiện này đều được chấp nhận. Bạn cần cài đặt hàm
replacement.


replacement(n, gondolaSeq, replacementSeq)
n là độ dài của dãy thuyền gondola.


gondolaSeq: dãy có độ dài ; gondolaSeq được đảm bảo là một dãy thuyền gondola,
và gondolaSeq[i] là phần tử của dãy với .


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

3 / 4



replacementSeq: mảng đủ lớn để chứa dãy thay thế; bạn cần trả về dãy thay thế bằng
cách gán giá trị phần tử của dãy thay thế cho replacementSeq[i], với


.


<b>Subtasks 4, 5, 6</b>



<b>subtask điểm</b> <b>gondolaSeq</b>


4 5 <sub>gondolaSeq[i]</sub>


5 10 <sub>gondolaSeq[i]</sub>


6 20 <sub>gondolaSeq[i]</sub>


<b>Ví dụ</b>



<b>subtask</b> <b>gondolaSeq</b> <b>giá trị trả về</b> <b>replacementSeq</b>


4 (3, 1, 4) 1 (2)


4 (5, 1, 2, 3, 4) 0 ( )
5 (2, 3, 4, 9, 6, 7, 1) 2 (5, 8)

<b>Đếm số dãy thay thế</b>



Trong bốn subtask tiếp theo, bạn phải đếm số lượng các dãy thay thế có thể, mà tạo ra một dãy cho
trước (có thể là một dãy thuyền gondola hoặc không phải), lấy phần dư khi chia cho <b>1,000,000,009</b>.
Bạn cần cài đặt hàm countReplacement.



countReplacement(n, inputSeq)
n: độ dài của dãy đầu vào.


inputSeq: mảng có độ dài ; inputSeq[i] là phần tử của dãy đầu vào với
.


Nếu dãy đầu vào là một dãy thuyền gondola, hãy đếm số lượng các dãy thay thế mà tạo
ra dãy thuyền gondola này (có thể có giá trị cực kỳ lớn), và trả về phần dư khi chia số
<i><b>này cho 1,000,000,009. Nếu dãy đầu vào không phải là một dãy thuyền gondola, hàm</b></i>
phải trả về giá trị 0. Nếu dãy đầu vào là một dãy thuyền gondola nhưng khơng có chiếc
gondola nào bị hỏng, hàm phải trả về 1.


<b>Subtasks 7, 8, 9, 10</b>



<b>subtask điểm</b> <b>inputSeq</b>


7 5 <sub>inputSeq[i]</sub>


8 15 inputSeq[i] , và ít nhất chiếc gondola ban đầu
không bị hỏng.


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

10 10 <sub>inputSeq[i]</sub>


<b>subtask điểm</b> <b>inputSeq</b>


<b>Ví dụ</b>



<b>subtask</b> <b>inputSeq</b> <b>giá trị trả về</b> <b>dãy thay thế</b>


7 (1, 2, 7, 6) 2 (3, 4, 5) hoặc (4, 5, 3)


8 (2, 3, 4, 12, 6, 7, 1) 1 (5, 8, 9, 10, 11)


9 (4, 7, 4, 7) 0 <sub>inputSeq</sub> không phải là một dãy thuyền gondola
10 (3, 4) 2 (1, 2) hoặc (2, 1)


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



Bạn phải nộp duy nhất một file được đặt tên gondola.c, gondola.cpp hoặc gondola.pas. File
này phải cài đặt cả ba chương trình con mơ tả ở trên (ngay cả khi bạn chỉ định giải quyết một vài
subtask), sử dụng các đặc tả dưới đây. Bạn cũng cần nạp header file gondola.h khi cài đặt sử dụng
C/C++.


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



int valid(int n, int inputSeq[]);


int replacement(int n, int gondolaSeq[], int replacementSeq[]);
int countReplacement(int n, int inputSeq[]);


<b>Pascal programs</b>



function valid(n: longint; inputSeq: array of longint): integer;
function replacement(n: longint; gondolaSeq: array of longint;
var replacementSeq: array of longint): longint;


function countReplacement(n: longint; inputSeq: array of longint):
longint;


<b>Sample grader</b>




Sample grader đọc dữ liệu đầu vào sử dụng định dạng sau:


dòng 1: T, số thứ tự của subtask mà chương trình của bạn định giải quyết ( ).
dịng 2: n, độ dài của dãy đầu vào.


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

1 / 3
<b>International Olympiad in Informatics 2014</b>


13-20th July 2014
Taipei, Taiwan


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

<b>holiday</b>



<b>Kỳ nghỉ</b>



Jian-Jia lên kế hoạch cho kỳ nghỉ tiếp theo tại Đài Loan. Trong kỳ nghỉ này, Jian-Jia di chuyển từ thành
phố này đến thành phố khác và thăm các điểm du lịch tại các thành phố.


Có thành phố tại Đài Loan, tất cả nằm dọc theo một con đường cao tốc. Các thành phố được đánh
số liên tiếp bắt đầu từ 0 đến . Thành phố với , liền kề với thành phố và


. Thành phố duy nhất liền kề với thành phố 0 là thành phố 1 và thành phố duy nhất liền kề với
thành phố là thành phố .


Mỗi thành phố có một số điểm du lịch. Jian-Jia có ngày cho kỳ nghỉ và lên kế hoạch để thăm được
nhiều điểm du lịch nhất. Jian-Jia đã chọn một thành phố làm thành phố xuất phát cho kỳ nghỉ của mình.
Mỗi ngày trong kỳ nghỉ, Jian-Jia hoặc di chuyển đến thành phố liền kề hoặc đi thăm tất cả các điểm du
lịch của thành phố mà nó đang dừng chân, nhưng khơng thực hiện cả hai điều này. Jian-Jia sẽ không
<i>bao giờ thăm các điểm du lịch trong cùng một thành phố hai lần ngay cả khi Jian-Jia ở trong</i>
thành phố nhiều lần. Hãy giúp Jian-Jia lên kế hoạch cho kỳ nghỉ của mình để thăm được nhiều điểm du


lịch khác nhau nhất.


<b>Ví dụ</b>



Giả sử Jian-Jia có 7 ngày cho kỳ nghỉ, có 5 thành phố (được liệt kê trong bảng dưới đây) và Jian-Jia
xuất phát từ thành phố 2. Trong ngày thứ nhất, Jian-Jia thăm quan 20 điểm du lịch ở thành phố 2.
Trong ngày thứ hai Jian-Jia di chuyển từ thành phố 2 đến thành phố 3 và trong ngày thứ ba thăm 30
điểm du lịch ở thành phố 3. Jian-Jia dành ba ngày tiếp theo để di chuyển từ thành phố 3 đến thành phố
0 và thăm 10 điểm du lịch ở thành phố 0 vào ngày thứ bảy. Tổng số điểm du lịch mà Jian-Jia thăm là
20 + 30 + 10 = 60, đó là số lượng lớn nhất các điểm du lịch mà Jian-Jia có thể thăm trong 7 ngày nếu
xuất phát từ thành phố 2.


<b>thành phố số điểm du lịch</b>


0 10


1 2


2 20


3 30


4 1


<b>ngày</b> <b>hoạt động</b>


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

7 thăm các điểm du lịch ở thành phố 0


<b>ngày</b> <b>hoạt động</b>



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



Bạn cần cài đặt hàm findMaxAttraction để tính số lượng nhiều nhất các điểm du lịch mà Jian-Jia
có thể thăm.


findMaxAttraction(n, start, d, attraction)
n: số lượng thành phố.


start: thành phố xuất phát.
d: số lượng ngày.


attraction: mảng có độ dài ; attraction[i] là số lượng điểm du lịch tại thành phố


, với .


Hàm phải trả về số lượng nhiều nhất các điểm du lịch mà Jian-Jia có thể thăm được.

<b>Subtasks</b>



Trong tất cả các subtasks có và số điểm du lịch tại mỗi thành phố là không
âm.


<b>Các ràng buộc thêm:</b>



<b>subtask điểm</b> <b>số điểm du lịch lớn nhất trong thành</b>


<b>phố</b> <b>thành phố xuấtphát</b>


1 7 1,000,000,000 khơng có ràng buộc


nào



2 23 100 thành phố 0


3 17 1,000,000,000 khơng có ràng buộc


nào


4 53 1,000,000,000 khơng có ràng buộc


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à holiday.c, holiday.cpp hoặc holiday.pas. File này cài
đặt chương trình con 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 holiday.h khi sử dụng C/C++.


Chú ý rằng kết quả có thể rất lớn và kiểu dữ liệu trả về của hàm findMaxAttraction là số nguyên
64-bit.


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

3 / 3


long long int findMaxAttraction(int n, int start, int d,
int attraction[]);


<b>Pascal program</b>



function findMaxAttraction(n, start, d : longint;
attraction : array of longint): int64;


<b>Sample grader</b>




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


line 2: attraction[0], ..., attraction[n-1].


</div>

<!--links-->

×