Thứ Sáu, 28 tháng 10, 2016

BULMART

Tạm dịch:
Có N thành phố được đánh số từ 1 đến N và w cửa hàng bán bánh được đánh số từ 1 đến w, cửa hàng thứ i được mô tả bởi 3 số cikipi trong đó ci là thành phố mà cửa hàng được đặt, ki là số lượng bánh có trong cửa hàng và pi là giá của mỗi chiếc bánh.
Có q khách hàng được đánh số từ 1 đến q, khách hàng thứ i cũng được mô tả bằng 3 thông số gi, ri và ai trong đó gi  cho biết thành phố mà người thứ i đang ở, ri là số lượng bánh người thứ i cần và ai là số tiền mà người thứ i có.
Yêu cầu: Hãy cho biết khoảng cách nhỏ nhất mà người thứ i cần di chuyển để mua được ri bánh. Nếu không mua được bánh thì ghi -1. Biết rằng việc mua bánh của người này không ảnh hưởng đến người khác.
Dữ liệu vào: từ tệp văn bản BULMART.INP
+ Dòng đầu tiên ghi 2 số nguyên n và m cho biết có n thành phố và m tuyến đường, mỗi tuyến đường nối 2 thành phố khác nhau
m dòng tiếp theo, mỗi dòng ghi 2 số u và v cho biết có 1 tuyến đường giữa hai thành phố u và v với độ dài bằng 1
+ Dòng tiếp theo ghi số nguyên w
w dòng tiếp theo dòng thứ i ghi 3 số ci, ki, pi
+ Dòng tiếp theo ghi số nguyên q
+ q dòng tiếp theo mỗi dòng ghi 3 số giri và ai
Dữ liệu ra: ghi vào tệp BULMART.OUT gồm q dòng, mỗi dòng trả lời cho 1 bộ giri và ai
Ví dụ:

BULMART.INP
BULMART.OUT
Giới hạn
6 4
4 2
5 4
1 2
3 2
2
4 1 2
3 2 3
6
1 2 6
2 3 7
3 1 2
4 3 8
5 2 5
6 1 10
2
-1
2
2
3
-1

+ 1≤ n, w ≤5000
+ 1≤ci≤n
+ 1≤ki, pi≤2.105
+ 1≤q≤1000
+ 1≤gi≤n
+ 1≤ri, ai≤109

Solution:
Với mỗi truy vấn gi, ri  ai , sử dụng thuật toán tìm kiếm nhị phân để xác định độ dài ngắn nhất mà người ở đỉnh gi mua được ri chiếc bánh với số tiền anh ta đang có là ai
L ¬0; R¬N (N là số đỉnh của đồ thị)
rest¬-1;
While L≤R do
Begin
  Mid¬ (L+R) div 2;
 If check(gi, ri, ai, mid) then
            Begin
                        rest¬mid; //rest là kết quả
                        R¬mid-1;
            End else L¬mid+1;
End;

Trong đó hàm check(gi, ri, ai, mid)  trả về True nếu người ở đỉnh gi có thể mua được ri chiếc bánh  với số tiền đang có là ai và các cửa hàng mà người đó mua có khoảng cách không quá mid.

Để xây dựng hàm check(gi, ri, ai, mid)  cần:
Duyệt tất cả các cửa hàng bán bánh trong khoảng cách không quá mid để mua, tuy nhiên ta cần duyệt cửa hàng nào có giá rẻ hơn trước. Lúc này cần giải quyết 2 vấn đề:
1. Làm thế nào để biết được khoảng cách từ gi đến tất cả các đỉnh khác? Do đồ thị đã cho không trọng số nên ta có thể chuẩn bị trước bằng mảng D[u,v] là độ dài đường đi ngắn nhất từ u đến v bằng cách dùng thuật toán BFS để tìm khoảng cách ngắn nhất giữa hai đỉnh bất kỳ:
For u:=1 to n do BFS(u);
lưu khoảng cách ngắn nhất từ đỉnh u đến v vào mảng D[u,v]

2. Làm thế nào để duyệt các cửa hàng có giá bán từ nhỏ đến lớn: sắp xếp tăng dần theo giá trị của chiếc bánh

Thứ Tư, 26 tháng 10, 2016

Tuyến xe Buýt

Nhà Thanh ở thành phố A, nhà Lê ở thành phố B, cuối tuần Thanh và Lê được nghỉ nên Thanh quyết định đến thành phố B để thăm Lê. Tuy nhiên Thanh chỉ có K đồng nên rất có thể Thanh phải đi xe buýt đến 1 số thành phố khác rồi mới tiếp tục đến B. Việc di chuyển qua nhiều thành phố có thể mất nhiều thời gian do vậy bạn hãy giúp Thanh tìm ra một hành trình đi từ A đến B sao cho thời gian di chuyển là ít nhất và Thanh vẫn còn tiền khi đến B. Biết rằng:
N thành phố được đánh số từ 1 đến N (bao gồm cả AB), giữa hai thành phố uv có thể thể có tuyến xe buýt hoặc không, nếu có thì bạn được biết từ thành phố u đến v đi bằng xe buýt sẽ mất t thời gian và tốn x đồng.
Dữ liệu vào: Từ tệp văn bản THANHLEE.INP
+ Dòng đầu tiên ghi 3 số nguyên K, N, M cho biết K là số đồng mà Thanh có, N là số lượng thành phố, M là số lượng các cặp thành phố có tuyến xe buýt.
+ M dòng tiếp theo mỗi dòng ghi 4 số nguyên u, v, t, x cho biết thông tin về tuyến xe buýt giữa thành phố uv mất t thời gian và x đồng.
+ Dòng cuối cùng ghi hai số nguyên AB
Các số trên cùng 1 dòng cách nhau ít nhất 1 ký tự trắng.
Dữ liệu ra: Một số nguyên thỏa yêu cầu của bài toán, nếu không có cách đi thì in ra số -1.
Giới hạn:
+ Trong tất cả các test: 1 ≤ K ≤ 200; 2 ≤ N ≤ 2 000; 1 ≤ M ≤ 10 000; 1≤ t ≤ 105; 0≤ x ≤200
+ Có 20% số điểm tương ứng với K=1 và N≤200
+ Có 20% số điểm tương ứng với K=1 và 200<N≤2000
Ví dụ:
THANHLEE.INP
THANHLEE.OUT

THANHLEE.INP
THANHLEE.OUT
10 4 7
1 2 4 4
1 3 7 2
3 1 8 1
3 2 2 2
4 2 1 6
3 4 1 1
1 4 6 12
1 4
7

3 3 3
1 2 5 1
3 2 8 2
1 3 1 3
1 3
-1
Đường đi: 1→2 →3→4

Không thể đi từ 1 qua 3


REINVENT

Nguồn: Mr Kiên
Zăhărel và Sica cần thay đổi tinh thần. Trong giai đoạn đầu, họ di chuyển đến trung tâm thành phố. Trung tâm thành phố có N ngôi nhà (Đánh số từ 1 đến N), được kết nối với nhau bởi M con đường hai chiều có chiều dài bằng nhau. Do Không có nhiều tiền nên họ chỉ có thể di chuyển trong một khu vực có x ngôi nhà. Là hai người bạn thân, họ muốn di chuyển đến 2 ngôi nhà riêng biệt nhưng càng gần nhau càng tốt. Hãy giúp họ xác định khoảng cách tối thiểu giữa hai ngôi nhà bất kỳ trong X ngôi nhà.
Dữ liệu vào: Từ tệp văn bản REINVENT.INP
+ Dòng đầu tiên ghi 3 số nguyên N, M và X. M dòng thiếp theo, mỗi dòng ghi 2 số nguyên phân biệt thể hiện một con đường hai chiều nối 2 ngôi nhà.
+ Dòng cuối cùng ghi X số nguyên phân biệt thể hiện các ngôi nhà trong khu vực được lựa chọn.
Dữ liệu ra: Ghi vào tệp văn bản REINVENT.OUT
+ Khoảng cách tối thiểu giữa hai ngôi nhà riêng biệt trong khu vực được chọn
Giới hạn:
+ 1≤N, M≤105
+ 2≤X≤N
+ Trong 30% tổng số test có N ≤ 1024
+ Khoảng cách giữa hai ngôi nhà được đo bằng số lượng tối thiểu các con đường trên tuyến đường nối hai ngôi nhà.
+ Giữa bất kỳ 2 ngôi nhà đề có ít nhất một tuyến đường hai chiều
+ Có ít nhất hai ngôi nhà trong khu phố được chọn
Ví dụ:

REINVENT.INP
REINVENT.OUT
5 6 2
1 2
2 3
2 4
3 4
1 4
3 5
1 5
3
Test - code  - solution

QUÂN HẬU

Xét bàn cờ tổng quát kích thước kx k, các hàng của bàn cờ được đánh số từ 1 tới k từ trên xuống dưới và các cột của bàn cờ được đánh số từ 1 tới k  từ trái qua phải. Ô nằm trên giao của hàng i và cột j được gọi là ô (i, j). Từ bàn cờ ban đầu gồm các ô trống, người ta đặt đúng n quân hậu vào n ô hoàn toàn phân biệt trên bàn cờ.
Ta nói một quân hậu ở ô (x, y) khống chế được ô trống (x, y) nếu đoạn thẳng nối tâm hai ô đó song song với một trong hai cạnh bàn cờ hoặc song song với một trong hai đường chéo của bàn cờ, đồng thời đoạn thẳng nối tâm của hai ô (x, y)(x’ , y) không đi qua tâm của bất kỳ ô nào chứa quân hậu khác.

Như ví dụ trên, quân hậu ở ô (4, 4) có thể khống chế được 16 ô trống đánh dấu “ü” trong hình.
Yêu cầu: Cho biết kích thước bàn cờ và vị trí n quân hậu, hãy đếm số ô trống bị quân hậu khống chế.
Dữ liệu: Vào từ file văn bản QUEENS.INP
·            Dòng 1 chứa hai số nguyên dương k≤109, n≤105
·            n dòng tiếp theo, dòng thứ i chứa hai số nguyên dương lần lượt là chỉ số hàng và chỉ số cột của quân hậu thứ i
Kết quả: Ghi ra file văn bản QUEENS.OUT n dòng, dòng thứ i ghi số ô trống bị quân hậu thứ i khống chế.
Ví dụ:

QUEENS.INP
QUEENS.OUT
8 7
1 1
1 7
3 4
4 4
4 7
6 2
7 7
14
11
20
16
16
19
15
Test - Code - Đề (word)

BẢO VỆ NÔNG TRANG

Nguồn: http://vn.spoj.com/problems/NKGUARD/
Solution:
Ý tưởng giải thuật: Ta sẽ làm 2 bước:
Bước 1: Với mỗi đỉnh [i,j] chưa thăm, ta dfs đánh dấu các đỉnh có chiều cao < a[i,j], ta sẽ đảm bảo rằng từ đỉnh có chiều cao a[u,v] nào đó, thủ tục dfs1 sẽ đánh dấu những đỉnh có chiều cao ≤ a[u,v] lận cận;
Như vậy chỉ có các đỉnh có chiều cao “đỉnh” còn lại;
Bước 2: Dfs để tìm các nhóm đỉnh, thực chất Dfs lần này là để đếm số lượng thành phần liên thông

Chương trình tham khảo:

CONNECT

Nguồn: Mr Kiên
Cho một đồ thị vô hương gồm N đỉnh và M cạnh, có Q truy vấn, mỗi truy vấn có dạng x, y. Yêu cầu kiểm tra xem x y có cũng thuộc một thành phần liên thông hay không (từ x có thể đi tới y thông qua một số cạnh hay không).
Dữ liệu vào: Từ tệp văn bản CONNECT.INP
+ Dòng đầu tiên chứa ba số nguyên dương N, M, Q lần lượt là số đỉnh, số cạnh và số lượng truy vấn (1≤N, M≤105, Q≤106+1 )
+ M dòng tiếp theo, mỗi dòng gồm hai số nguyên dương x, y, chỉ một cạnh nối hai đỉnh xy.
+ Q dòng tiếp theo, mỗi dòng là một truy vấn có dạng x y.
Dữ liệu ra: Ghi vào tệp văn bản CONNECT.OUT
Với mỗi truy vấn dạng x y, in ra “YES” nếu xy là hai đỉnh cùng thuộc một thành phần liên thông, in ra “NO” trong trường hợp ngược lại.
CONNECT.INP
CONNECT.OUT
3 1 3
1 2
2 1
1 3
3 2
YES
NO
NO




BFS2

Nguồn: Mr Kiên
Cho một đơn đồ thị liên thông gồm N đỉnh và N-1 cạnh. Mỗi cạnh có độ dài bằng 1. Ta nói đây là một cây không trọng số.
Đường kính của cây là khoảng cách giữa hai đỉnh xa nhau nhất. Tâm của cây là đỉnh mà có khoảng cách từ nó tới nút xa nó nhất là nhỏ nhất. Một cây có thể có nhiều tâm.
Hãy tìm đường kính của cây và các tâm của cây.
Dữ liệu vào: Từ tệp văn bản BFS2.INP
+ Dòng đầu tiên chứa số nguyên dương N (1≤N≤105)
+ N-1 dòng tiếp theo, mỗi dòng gồm hai số nguyên dương xy chỉ một cạnh nối giữa hai đỉnh xy trên cây.
Dữ liệu ra: Ghi vào tệp văn bản BFS2.OUT
+ Dòng đầu tiên, in ra đường kính của cây.
+ Dòng thứ hai, in ra số lượng tâm của cây.
+ Dòng thứ ba, in ra các đỉnh là tâm của cây theo thứ tự tăng dần. Các số cách nhau bởi 1 dấu cách.
Ví dụ:
BFS2.INP
BFS2.OUT
5
1 2
2 3
3 4
2 5
4
2
2 3



BFS1

Nguồn: Mr Kiên
Cho đồ thị vô hướng gồm N đỉnh và M cạnh, độ dài của mỗi cạnh bằng 1. Tìm độ dài đường đi ngắn nhất từ đỉnh 1 đến cách đỉnh còn lại của đồ thị.
Dữ liệu vào: Từ tệp văn bản BFS1.INP
+ Dòng đầu tiên gồm hai số nguyên dương NM (1≤N, M≤105)
+ M dòng tiếp theo, mỗi dòng gồm 2 số nguyên dương xy, chỉ 1 cạnh nối giữa hai đỉnh x y
Dữ liệu ra: ghi vào tệp văn bản BFS1.OUT
+ In ra N dòng, dòng thứ i là độ dài đường đi ngắn nhất từ đỉnh 1 đến đỉnh i.
+ Nếu không thể đi từ 1 đến i, in ra -1
Ví dụ:
BFS1.INP
BFS1.OUT
5 4
1 2
2 3
2 4
3 4
0
1
2
2
-1