| # | Bài tập | Điểm | Thời gian: | Giới hạn bộ nhớ |
|---|---|---|---|---|
| 1 | JOI 2017 - Long Distance Coach | 100 (p) | 2.0s | 256M |
| 2 | JOI 2017 - Long Mansion | 100 (p) | 3.0s | 256M |
| 3 | JOI 2017 - Natural Park | 100 (p) | 3.0s | 256M |
Có một tuyến xe khách đường dài nối thành phố I với thành phố O. Trên xe có một máy cấp nước cho hành khách và tài xế. Xe rời thành phố I tại thời điểm \(0\) và đến thành phố O tại thời điểm \(X\). Trên đường có \(N\) điểm tiếp nước; xe đến điểm thứ \(i\) tại thời điểm \(S_i\).
Ban đầu máy không có nước. Có thể đổ nước vào máy trước khi khởi hành và khi xe dừng tại một điểm tiếp nước. Nước có giá \(W\) yên mỗi lít tại mọi nơi.
Tại thành phố I có \(M\) hành khách lên xe, được đánh số từ \(1\) đến \(M\). Không ai lên xe ở nơi khác. Hành khách \(j\) cần một lít nước lần đầu tại thời điểm \(D_j\), rồi cứ sau mỗi \(T\) đơn vị thời gian lại cần một lít, tức tại các thời điểm \(D_j+kT\) với \(k=0,1,2,\ldots\). Ta có \(1\le D_j<T\), và \(T\) giống nhau đối với mọi người. Nếu máy hết nước khi một hành khách cần uống, người đó rời xe. Nếu hành khách \(j\) rời xe trước khi tới thành phố O, phải hoàn lại \(C_j\) yên tiền vé.
Tài xế cần một lít nước tại các thời điểm \(kT\) với \(k=0,1,2,\ldots\). Nếu máy hết nước khi tài xế cần uống, xe không thể tiếp tục hành trình.
Không có hai người cần nước cùng lúc. Khi xe đến thành phố O hoặc một điểm tiếp nước, không ai cần nước. Hãy lựa chọn lượng nước đổ vào máy để xe đến được thành phố O và tổng chi phí mua nước cùng tiền hoàn vé là nhỏ nhất.
In ra một số nguyên là tổng chi phí nhỏ nhất.
Ví dụ 1
19 1 4 8 7
10
1 20
2 10
4 5
6 5
103
Đổ \(7\) lít trước khi khởi hành và \(4\) lít tại thời điểm \(10\). Hành khách \(2\) rời xe tại thời điểm \(9\), hành khách \(3\) rời xe tại thời điểm \(18\). Tổng cộng dùng \(11\) lít, tốn \(88\) yên; tiền hoàn vé là \(10+5=15\) yên, nên tổng chi phí là \(103\) yên. Không thể vận hành xe với chi phí không quá \(102\) yên.
Ví dụ 2
105 3 5 9 10
59
68
71
4 71
6 32
7 29
3 62
2 35
547
Ví dụ 3
1000000000000 1 1 1000000 6
999999259244
1 123456789
333333209997456789
JOI 2016/2017 Spring Training Camp, ngày thi 3, bài Long Distance Coach.
Gần nhà JOI-kun có một dinh thự gồm \(N\) phòng nằm trên một hàng từ đông sang tây. Phòng thứ \(i\) tính từ phía đông được gọi là phòng \(i\). Với mỗi \(1\le i<N\), hành lang nối phòng \(i\) và phòng \(i+1\) có thể đi theo cả hai chiều, nhưng muốn đi vào hành lang từ một trong hai đầu phải có chìa khóa loại \(C_i\).
Phòng \(i\) chứa \(B_i\) chìa khóa có loại \(A_{i,1},A_{i,2},\ldots,A_{i,B_i}\). Khi vào một phòng, JOI-kun nhặt tất cả chìa khóa trong đó. Mỗi chìa khóa được dùng không giới hạn số lần; sở hữu nhiều chìa cùng loại không đem lại lợi ích thêm.
Mỗi truy vấn cho hai phòng \(x,y\): nếu JOI-kun xuất hiện tại phòng \(x\) mà không có chìa khóa nào, liệu cậu có thể đi tới phòng \(y\) hay không?
Với mỗi truy vấn, in YES nếu có thể đi từ \(X_k\) tới \(Y_k\), ngược lại in NO.
Ví dụ 1
5
1 2 3 4
2 2 3
1 1
1 1
1 3
1 4
4
2 4
4 2
1 5
5 3
YES
NO
NO
YES
Truy vấn đầu có thể đi qua các phòng \(2,1,2,3,4\). Ở truy vấn thứ hai, từ phòng \(4\) chỉ có thể thăm phòng \(3,4\) và lấy chìa loại \(1,3\), nên không tới được phòng \(2\). Ở truy vấn thứ ba không thể lấy chìa loại \(4\) để đi từ phòng \(4\) sang phòng \(5\). Truy vấn cuối đi theo \(5,4,3\).
Ví dụ 2
5
2 3 1 3
1 3
1 2
1 1
1 3
1 2
4
1 3
3 1
4 3
2 5
NO
YES
NO
YES
Ví dụ 3
7
6 3 4 1 2 5
1 1
1 5
1 1
1 1
2 2 3
1 4
1 6
3
4 1
5 3
4 7
YES
NO
YES
JOI 2016/2017 Spring Training Camp, ngày thi 3, bài Long Mansion.
Đảo JOI là một công viên tự nhiên gồm \(N\) địa điểm, đánh số từ \(0\) đến \(N-1\), và một số con đường hai chiều. Mỗi đường nối hai địa điểm khác nhau, giữa một cặp địa điểm có nhiều nhất một đường, bậc của mỗi địa điểm không quá \(7\), và toàn bộ mạng đường liên thông.
Bạn cần xác định toàn bộ mạng đường bằng cách hỏi IOI-chan liệu hai địa điểm có nối được với nhau khi chỉ được phép đi qua một tập địa điểm cho trước hay không. Bạn được hỏi không quá \(45\,000\) lần.
Chương trình phải khai báo #include "park.h" và cài đặt:
void Detect(int T, int N);
Hàm được gọi đúng một lần. T là số hiệu nhóm, N là số địa điểm.
Để báo một con đường, gọi:
void Answer(int A, int B);
Số lần gọi Answer phải đúng bằng số con đường. Mỗi lần gọi phải thỏa \(0\le A<B\le N-1\) và \((A,B)\) phải là một con đường thật. Vi phạm lần lượt bị chấm Wrong Answer [1], [2]; gọi nhiều hơn một lần với cùng cặp \((A,B)\) bị [3]. Nếu Detect kết thúc mà còn đường chưa báo, nhận [6].
Có thể hỏi:
int Ask(int A, int B, int Place[]);
Mảng Place phải có đúng \(N\) phần tử. Place[i]=1 nghĩa là được phép đi qua địa điểm \(i\), còn Place[i]=0 nghĩa là không. Hàm trả về \(1\) nếu có đường đi từ \(A\) đến \(B\) chỉ qua các địa điểm được phép, ngược lại trả về \(0\).
Mỗi lời gọi phải thỏa \(0\le A<B\le N-1\), mọi Place[i] thuộc \(\{0,1\}\), và Place[A]=Place[B]=1; nếu không nhận Wrong Answer [4]. Hành vi không được đảm bảo nếu độ dài mảng khác \(N\). Gọi quá \(45\,000\) lần nhận [5].
Chương trình có thể cài đặt hàm phụ và dùng biến toàn cục. Chương trình không được đọc/ghi luồng chuẩn hoặc giao tiếp với tệp khác.
Gói chính thức chứa trình chấm mẫu và mã nguồn mẫu. Nếu bài làm là park.c hoặc park.cpp, có thể biên dịch bằng một trong các lệnh:
gcc -std=c11 -O2 -o grader grader.c park.c -lm
g++ -std=c++14 -O2 -o grader grader.cpp park.cpp
Trình chấm thật khác trình chấm mẫu. Trình chấm mẫu chạy trong một tiến trình, đọc đầu vào chuẩn và ghi đầu ra chuẩn.
Trình chấm mẫu in Accepted. nếu đúng; nếu sai, in một thông báo dạng Wrong Answer [1] rồi kết thúc. Nếu có nhiều lỗi, chỉ một lỗi được báo.
Ask: không quá \(45\,000\).1
6
7
0 1
0 3
1 2
1 4
2 4
2 5
3 4
Detect(1,6) được gọi. Chuỗi lời gọi minh họa là:
| Lời gọi | Giá trị trả về |
|---|---|
Ask(3,5,{0,0,1,1,1,1}) |
1 |
Answer(2,4) |
|
Answer(2,5) |
|
Answer(3,4) |
|
Ask(0,4,{1,0,1,0,1,0}) |
0 |
Answer(0,1) |
|
Answer(0,3) |
|
Answer(1,4) |
|
Answer(1,2) |
Lời hỏi đầu tiên chỉ cho phép đi qua các địa điểm \(2,3,4,5\), nên có đường đi từ \(3\) tới \(5\) và hàm trả về \(1\). Lời hỏi thứ hai chỉ cho phép đi qua \(0,2,4\), nên không có đường đi từ \(0\) tới \(4\) và hàm trả về \(0\). Chuỗi minh họa không nhất thiết thể hiện một thuật toán có ý nghĩa.
JOI 2016/2017 Spring Training Camp, ngày thi 3, bài Natural Park.