| # | Bài tập | Điểm | Thời gian: | Giới hạn bộ nhớ |
|---|---|---|---|---|
| 1 | JOI 2017 - Amusement Park | 100 (p) | 3.0s | 256M |
| 2 | JOI 2017 - Bulldozer | 100 (p) | 2.0s | 512M |
| 3 | JOI 2017 - Golf | 100 (p) | 5.0s | 1G |
JOI-kun và em gái IOI-chan đang chơi tại công viên JOIOI. Công viên có \(N\) trò chơi, đánh số từ \(0\) đến \(N-1\), và \(M\) đường đi hai chiều. Mỗi đường nối hai trò chơi khác nhau; từ mọi trò chơi đều có thể đi đến mọi trò chơi khác.
Mỗi trò chơi có một bảng tin, trên đó JOI-kun được ghi đúng một số \(0\) hoặc \(1\). Nội dung đã ghi không bị khách khác thay đổi. Hai người sẽ chơi riêng rồi gặp lại. Không có thiết bị liên lạc, JOI-kun muốn truyền cho IOI-chan số nguyên \(X\) biểu diễn thời gian gặp mặt:
Hãy viết hai chương trình để IOI-chan xác định đúng \(X\) với ít lần di chuyển. Hai chương trình nhận cùng một đồ thị, gồm cùng số hiệu đỉnh và cùng thứ tự các cạnh.
Bạn cần cài đặt hai hàm sau trong cùng bài nộp:
void Joi(int N, int M, int A[], int B[], long long X, int T);
long long Ioi(int N, int M, int A[], int B[], int P, int V, int T);
Mỗi hàm được gọi đúng một lần cho mỗi bộ kiểm thử.
Trong cả hai hàm, \(N,M\) là số trò chơi và số đường; cạnh thứ \(i\) nối \(A[i]\) với \(B[i]\) (\(0\le i<M\)); \(T\) là số hiệu nhóm. Với Joi, \(X\) là số cần truyền. Với Ioi, \(P\) là trò chơi ban đầu và \(V\) là giá trị trên bảng tin tại \(P\).
Trong Joi, gọi:
void MessageBoard(int attr, int msg);
để ghi msg lên bảng tại attr.
Wrong Answer[1].attr; nếu vi phạm, nhận Wrong Answer[2].msg phải bằng \(0\) hoặc \(1\); nếu không, nhận Wrong Answer[3].MessageBoard đúng \(N\) lần; nếu không, nhận Wrong Answer[4].Joi dừng ngay.Trong Ioi, gọi:
int Move(int dest);
để di chuyển tới dest; hàm trả về giá trị trên bảng tin tại đó.
Wrong Answer[6].dest phải kề vị trí hiện tại; nếu không, nhận Wrong Answer[7].Move quá \(20\,000\) lần; nếu vi phạm, nhận Wrong Answer[8].Ioi phải trả về đúng \(X\); nếu không, nhận Wrong Answer[5].Bạn có thể khai báo hàm phụ và biến toàn cục, nhưng mọi hàm/biến nội bộ nên được khai báo static để tránh xung đột tên. Khi chấm chính thức, Joi và Ioi chạy trong hai tiến trình riêng biệt, vì vậy không thể chia sẻ biến toàn cục. Không được đọc/ghi luồng chuẩn hoặc dùng tệp hay phương thức khác để liên lạc.
Bộ chấm mẫu đọc:
Nếu đúng, bộ chấm mẫu in Accepted : #move=12345, trong đó số cuối là số lần gọi Move. Nếu sai, nó in Wrong Answer [k]. Nếu có nhiều lỗi, chỉ một lỗi được báo. Bộ chấm mẫu chạy trong một tiến trình và khác bộ chấm chính thức; chương trình không được dựa vào sự khác biệt này.
Move không quá \(250\) lần.Move lớn nhất trên mọi bộ kiểm thử của nhóm. Điểm nhóm làKhi \(C>960\), hệ thống chính thức có thể hiển thị Correct : 0 point hoặc Incorrect.
Move không quá \(120\) lần.PDF chỉ hiển thị phần đầu của ví dụ vì dữ liệu đầy đủ khá dài. Tệp sample-01.txt đầy đủ nằm trong tệp đính kèm chính thức.
60 59 123 5 1
0 1
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
...
| Lời gọi | Giải thích |
|---|---|
Trong ví dụ, Joi nhận \(X=123\) |
và ghi lần lượt một số bit, trong đó các bảng \(0,1,2,3,4,5\) nhận \(0,1,1,0,0,1\). |
Ioi bắt đầu tại \(P=5\) với \(V=1\); một phần chuỗi gọi là Move(4), Move(3), Move(2), Move(3), |
nhận lại \(0,0,1,0\), rồi trả về \(123\). |
JOI 2016/2017 Open Contest.
Vương quốc JOI nổi tiếng về vàng. Lãnh thổ được biểu diễn trên mặt phẳng tọa độ, với \(N\) địa điểm. Địa điểm thứ \(i\) nằm tại \((X_i,Y_i)\) và chứa vàng hoặc đá, nhưng không chứa cả hai.
Nếu địa điểm chứa vàng, khai thác một lần thu được vàng trị giá \(V_i\). Nếu chứa đá, khai thác một lần phải trả chi phí \(C_i\) để xử lý đá.
Để khai thác, trước hết chọn hai đường thẳng song song, rồi khai thác một lần toàn bộ vàng và đá trong miền nằm giữa hai đường, kể cả trên hai đường biên. Lợi nhuận bằng tổng giá trị vàng trừ tổng chi phí xử lý đá trong miền. Có thể chọn một miền không chứa địa điểm nào.
Hãy tính lợi nhuận lớn nhất.
In lợi nhuận lớn nhất.
Ví dụ 1
5
-5 5 -2
2 5 10
1 4 -2
4 -5 4
-2 2 7
19
Có thể chọn miền chứa các địa điểm \(2,3,4,5\), thu lợi nhuận lớn nhất là \(19\).
Ví dụ 2
6
0 0 6
1 0 -2
2 0 8
0 1 -2
1 1 5
2 1 -2
15
Các điểm \(1,2,3\) thẳng hàng; các điểm \(4,5,6\) cũng thẳng hàng.
Ví dụ 3
5
0 0 2
4 0 2
3 2 -1
1 2 2
1 1 -1
5
Không có ba điểm phân biệt thẳng hàng, nhưng đường qua điểm \(1,2\) song song với đường qua điểm \(3,4\).
Ví dụ 4
2
0 0 -1
1 0 -1
0
Có thể chọn miền không chứa vàng hoặc đá nào.
Ví dụ 5
15
10 3 30
5 10 -17
4 -5 14
0 -3 -9
-2 3 17
6 9 -19
-9 -6 -14
-2 -3 10
-3 -3 30
8 1 -28
9 -9 -5
7 -5 -24
-8 -10 5
-7 2 20
10 -3 -13
107
JOI 2016/2017 Open Contest.
JOI-kun luyện tập trên một sân golf đặc biệt, được biểu diễn bằng mặt phẳng tọa độ. Có \(N\) chướng ngại vật. Chướng ngại vật thứ \(i\) là hình chữ nhật kín
Hai chướng ngại vật, kể cả biên, không giao nhau. Điểm bắt đầu là \((S,T)\) và điểm kết thúc là \((U,V)\); hai điểm khác nhau và không nằm trên chướng ngại vật hay biên của chúng.
Mỗi cú đánh có thể đưa bóng đi một khoảng tùy ý theo một trong bốn hướng song song với trục tọa độ. Quỹ đạo bóng không được chạm phần trong của chướng ngại vật, nhưng có thể đi trên biên hoặc dừng trên biên. Từ đó, bóng có thể đổi hướng bằng một cú đánh về phía không bị chướng ngại vật chắn.
Hãy tính số cú đánh ít nhất để đưa bóng từ điểm đầu đến điểm cuối.
In số cú đánh ít nhất.
Ví dụ 1
3 5 8 6
1
5 6 2 8
3
Có thể đi theo \((3,5)\to(3,2)\to(8,2)\to(8,6)\) bằng ba cú đánh, và không thể dùng ít hơn.
Ví dụ 2
1 1 1 10
3
5 6 2 8
1 2 2 3
8 10 3 5
1
Có thể đưa bóng từ điểm đầu đến điểm cuối bằng một cú đánh.
Ví dụ 3
20 68 85 74
5
30 70 14 100
5 24 15 67
75 86 75 79
75 90 19 62
93 98 26 58
4
JOI 2016/2017 Open Contest.