Thứ Sáu, 6 tháng 11, 2015

TÌM KHOÁ


Phương pháp mã hoá đơn giản nhất trong mật mã học là thay thế từng ký tự của chuỗi cần mã hoá bằng một ký tự tương ứng trong bảng chữ cái theo khoá k=k1k2…k26 là một hoán vị của 26 chữ cái thường trong bảng chữ cái tiếng Anh, trong đó k1 được thay bằng ‘a’, k2 được thay bằng ‘b’
Chẳng hạn với khoá k=dbocefghijklmnapqrstuvwxyz thì chuỗi ‘cat’ được mã hoá thành ‘dot’ trong đó ‘c’ thay bằng ‘d’, ‘a’ thay bằng ‘o’ và ‘t’ thay bằng ‘t’.
Yêu cầu: cho n chuỗi ký tự s1, s2,…,sn. Hãy tìm một khoá k để mã hoá s1, s2,…,sn thành t1, t2,…,tn sao cho t1, t2,…,tn tạo thành dãy có thứ tự từ điển (t1<= t2<=…<=tn)
Dữ liệu: vào từ tệp văn bản KEY.INP
+ Dòng đầu tiên chứa số nguyên dương n (1<n<=105)
+ Dòng thứ i trong n dòng tiếp theo chứa chuỗi ký tự latin in thường si có độ dài không quá 100
Kết quả: ghi ra tệp văn bản KEY.OUT khoá k gồm 26 ký tự latin là một hoán vị của bảng chữ cái latin in thường. Nếu không tồn tại thì phải ghi thông báo ‘No Solution’.
Ví dụ:
KEY.INP
KEY.OUT
5
dog
donky
duck
cat
goose
docugnbefhijklmpqrstvwxyaz
Giải thích: Với khoá k= docugnbefhijklmpqrstvwxyaz thì các chuỗi sau phép biến đổi có thứ tự từ điển:
                  dog   ->  abe
                  donky ->   abfmhx
                  duck  ->   adcm
                  cat   ->   cyt
                  goose ->   ebbsh


TỔNG

Steve mới được quà sinh nhật từ bố mẹ. Đó là một chiếc máy tính bấm tay Casio mới tinh. Sau khi được hướng dẫn cách thực hiện liên hoàn các phép tính Steve chạy về phòng mình ngồi hàng giờ để tính tổng các số nguyên liên tiếp
a + (a+1) + (a+2) + . . . + b
Steve hãnh diện cho bố mẹ xem tổng S nhận được và ngẩn người khi được hỏi tổng S được tính từ đâu tới đâu!
Yêu cầu: Cho số nguyên S (1 ≤ S ≤ 1012). Hãy xác định các cặp số nguyên dương a, b (ab) tương ứng với S đã cho.
Dữ liệu vào: từ file văn bản SUM.INP gồm một dòng chứa số nguyên S.
Dữ liệu ra: ghi vào file văn bản SUM.OUT:
+ Dòng đầu tiên chứa số nguyên k – số lượng cặp số tìm được,
+ Mỗi dòng trong k dòng sau chứa một cặp số nguyên a, b.
Các cặp số đưa ra theo thứ tự tăng dần của a.
Ví dụ:

SUM.INP
SUM.OUT
25
3
3 7
12 13
25 25

Solution: Tương tự bài COUNTCBG

COUNT N

      Nguồn bài: http://vn.spoj.pl/problems/COUNTCBG/
Với 1 số tự nhiên N(1<= N <= 10^9) ta có thể phân tích nó thành tổng của một số số tự nhiên liên tiếp (tất nhiên những số này phải nhỏ hơn N). Ví dụ với N = 5 ta có duy nhất 1 cách phân tích là 5 = 2+3. Bài toán đặt ra là cho số tự nhiên N, hãy cho biết có bao nhiêu cách phân tích số tự nhiên N thành tổng của các số tự nhiên liên tiếp.
Dữ liệu vào từ tệp COUNTCBG.INP
Gồm nhiều dòng, mỗi dòng chứa một số nguyên N. (Giới hạn : số dòng <= 100)
Dữ liệu ra ghi vào tệp COUNTCBG.OUT
Mỗi dòng ghi một số nguyên là số cách phân tích số N đọc được ở dòng tương ứng trong input.
Ví dụ:

COUNTCBG.INP
COUNTCBG.OUT
12
5
4
13
45
100
234
3
175
1
1
0
1
5
2
5
1
5

TẤM KHIÊN

Hiệp sỹ Petrein đến làm khách ở Chúa tể Bóng đêm đã được vài tuần, được nghe về các kỳ tích hiển hách của vị Chúa tể trong những năm gần đây và hiểu rằng đã lâu lắm mình chưa lập một kỳ tích nào cả. Cùng nhau cân nhắc kỹ lưỡng bên chén trà hai người thống nhất là Petrein phải đi giết con Rồng lửa đang tác oai tác quái phía tây của vương quốc.
Nhưng có hiệp sỹ nào lên đường mà không có giáp phục, giáo và khiên! Petrein hiện đang có 2 cái khiên hình tam giác, nhưng ông cho rằng như thế là chưa đủ. Khiên phải càng to càng tốt và ông quyết định giao cho thợ rèn làm khiên mới từ 2 khiên hiện có. Người thợ rèn của hoàng cung đề nghị hàn mép của hai khiên nối chúng thành một khiên duy nhất. Petrein nhận thấy dù có hàn cách nào diện tích khiên mới cũng không đổi, vì vậy ông đề nghị hàn sao cho chu vi của khiên mới là nhỏ nhất để không phải tốn nhiều vàng làm đường viền cho khung. Cái khiên phải mang biểu tượng của gia tộc!
Yêu cầu: Cho 6 số nguyên a1, b1, c1a2, b2, c2 – độ dài các cạnh của 2 khiên. Các độ dài có giá trị không vượt quá 105 và cạnh của tam giác không suy biến. Hãy xác định chu vi nhỏ nhất có thể nhận được.
Dữ liệu: Vào từ file văn bản SHIELD.INP:
·         Dòng đầu tiên chứa 3 số nguyên a1, b1c1,
·         Dòng thứ 2 chứa 3 số nguyên a2, b2c2.
Kết quả: Đưa ra file văn bản SHIELD.OUT một số nguyên – chu vi nhỏ nhất có thể nhận được.
Ví dụ:

SHIELD.INP
SHIELD.OUT
3 4 5
6 7 8
23

SOLUTION - TEST - CODE

KHÔI PHỤC ĐA GIÁC

Bờm vẽ trên mặt phẳng một hình đa giác tổng quát (đường gấp khúc khép kín không tự cắt) với các cạnh song song với các trục tọa độ và các đỉnh có tọa độ nguyên. Sau đó vì vô ý Bờm đã xóa mất tất cả các cạnh đứng (song song với trục tung) của đa giác. Bạn hãy tìm cách từ những thông tin còn lại trên hình vẽ giúp Bờm tính diện tích của đa giác ban đầu.
Dữ liệu vào: từ tệp văn bản POLYGON.INP
+ Dòng đầu tiên chứa N là số cạnh nằm ngang (cạnh song song với trục hoành) của đa giác đã cho (N≤1000)
+ Mỗi dòng trong số N dòng tiếp theo chứa thông tin về một cạnh nằm ngang của đa giác bao gồm 4 số nguyên x, y, u, v được ghi cách nhau bởi dấu cách, trong đó (x,y) và (u,v) là hai cặp tọa độ của hai đầu mút của cạnh nằm ngang. Giả thiết rằng các tọa độ là các số nguyên có giá trị tuyệt đối không quá 100.
Dữ liệu ra: ghi vào tệp văn bản POLYGON.OUT
+ Dòng đầu tiên ghi diện tích của đa giác                       
+ Dòng thứ i trong số 2*N dòng tiếp theo chứa tọa độ đỉnh thứ i của đa giác được liệt kê theo thứ tự đi vòng quanh đa giác theo chiều kim đồng hồ (đỉnh bắt đầu được chọn tùy ý)
Ví dụ:

POLYGON.INP
POLYGON.OUT
2
1 1 3 1
1 3 3 3
4
1 1
1 3
3 3
3 1

DÃY LIÊN TỤC

Dãy số A1, A2,…,AN được gọi là dãy số liên tục nếu trong nó có mặt tất cả các số từ 1 đến N. Cho trước một dãy số A1, A2,…,AN. Hỏi phải thay bao nhiêu số trong dãy để được một dãy liên tục.
Dữ liệu vào: Tệp văn bản PERMU.INP
+ Dòng đầu ghi số N (N  106)
+ N dòng còn lại với dòng i (i = 1..N) ghi số Ai (1 Ai 106)
Dữ liệu ra: Tệp văn bản PERMU.OUT
Chỉ một dòng duy nhất ghi số các số cần thay đổi để dãy đã cho trở thành dãy liên tục.
Ví dụ
PERMU.OUT
PERMU.OUT
3
2 1 3
0


PERMU.OUT
PERMU.OUT
2
2 2
1

SOLUTION - TEST 

ĐẾ CHẾ

Một đế chế đang xây dựng mạng lưới cho các hành tinh trong nó. Đế chế gồm có N hành tinh được biểu diễn như các điểm trong không gian 3 chiều. Chi phí phải chi cho việc nối giữa hành tinh A và hành tinh B là min{ |xA - xB|, |yA - yB|, |zA - zB| } với (xA, yA, zA), (xB, yB, zB) là tọa độ của hành tinh A, B trong không gian 3 chiều. Đế chế dự tính sẽ xây dựng N – 1 cầu nối như vậy để các hành tinh liên thông với nhau và chi phí để trả sao cho phải nhỏ nhất có thể.
Dữ liệu vào: Từ tệp văn bản DECHE.INP
+ Dòng đầu là số hành tinh N (N < 100001).
+ N dòng sau mỗi dòng là tọa độ của một hành tinh.
Dữ liệu ra: Ghi vào tệp DECHE.OUT
Ghi trên một dòng duy nhất chi phí nhỏ nhất có thể.
Ví dụ:

 DECHE.INP
DECHE.OUT
5
11 -15 -15
14 -5 -15
-1 -1 -5
10 -4 -1
19 -4 19
4

 SOLUTION - CODE - TEST

LẮP ĐẶT CAMERA

Hệ thống đường có thể được mô tả bởi một dãy các nút giao thông và các đường nối hai chiều. Một vòng đua bao gồm một nút giao thông xuất phát, tiếp theo là đường đi bao gồm ít nhất 3 tuyến đường và cuối cùng quay trở lại điểm xuất phát. Trong một vòng đua, mỗi tuyến đường chỉ được đi qua đúng một lần, theo đúng một hướng.
Chi phí để đặt camera phụ thuộc vào tuyến đường được chọn. Camera được đặt trên các tuyến đường chứ không phải tại các nút giao thông. Bạn cần chọn một số tuyến đường sao cho chi phí lắp đặt là thấp nhất đồng thời vẫn đảm bảo có ít nhất một camera dọc theo mỗi vòng đua.
Viết chương trính tìm cách đặt các camera theo dõi giao thông sao cho tổng chi phí lắp đặt là thấp nhất.
Dữ liệu vào: Từ tệp văn bản CAMERA.INP
+ Dòng đầu tiên gồm 2 số nguyên dương n và m (1≤n≤10000; 1≤m≤100000) là số nút giao thông và số đường nối. Các nút giao thông được đánh số từ 1 đến n.
+ m dòng tiếp theo mỗi dòng gồm 3 số u, v và c cho biết chi phí lắp đặt camera từ nút v đến nút u là c. Chi phí lắp đặt trong phạm vi [1,1000]
Dữ liệu ra: ghi vào tệp văn bản CAMERA.OUT một số nguyên duy nhất là tổng chi phí lắp đặt thấp nhất tìm được.
Ví dụ:

CAMERA.INP
CAMERA.OUT
6 7
1 2 5
2 3 3
1 4 5
4 5 4
5 6 4
6 3 3
5 2 3
6

SOLUTION - CODE - TEST

ĐUA NGỰA

Một lần Tôn Tẫn đua ngựa với vua Tề. Tôn Tẫn và vua Tề mỗi người có con ngựa đánh số từ 1 tới n, con ngựa thứ I của Tôn Tẫn có tốc độ là ai,, con ngựa thứ i của vua Tề có tốc độ là bi. Luật chơi như sau:
+ Có tất cả n cặp đua, mỗi cặp đua có một ngựa của Tôn Tẫn và một ngựa của vua Tề.
+ Con ngựa nào cũng phải tham gia đúng một cặp đua
+ Trong một cặp đua, con ngựa nào tốc độ cao hơn sẽ thắng, nếu hai con ngựa có cùng
tốc độ thì kết quả của cặp đua đó sẽ hoà.
+ Trong một cặp đua, con ngựa của bên nào thắng thì bên đó sẽ được 1 điểm, hoà không có điểm, thua bị trừ 1 điểm.
Hãy giúp Tôn Tẫn chọn ngựa ra đấu cặp đua với vua Tề sao cho hiệu số: Điểm của Tôn Tẫn - Điểm của vua Tề là lớn nhất có thể.
Dữ liệu: Vào từ file văn bản RACE.INP
+Dòng 1: Chứa số nguyên dương
 +Dòng 2: Chứa số nguyên dương ( a1, a2,…,an)
+ Dòng 3: Chứa số nguyên dương ( b1, b2,…,bn)
Kết quả: ghi ra file văn bản RACE.OUT n dòng, mỗi dòng chứa số hiệu con ngựa của Tôn Tẫn và số hiệu con ngữa của vua Tề sẽ đấu với nhau trong 1 cặp đấu.
Các số trên một dòng của Input/Output file được/phải ghi cách nhau ít nhất một dấu cách
Ví dụ:

RACE.INP
RACE.OUT

RACE.INP
RACE.OUT
5
5 4 3 2 1
6 5 4 3 2
5 1
4 2
1 3
2 4
3 5

2
5 2
5 1
1 1
2 2


RACE.INP
RACE.OUT
2
3 1
2 1
1 1
2 2

SOLUTION CODE

++++++++++++++++++++++++++++
   +       VŨ VĂN TIẾN        +   
+   CHUYÊN TIN 2013-2016   +
+  LÊ QÚY ĐÔN - KHÁNH HÒA  +
++++++++++++++++++++++++++++

Thứ Năm, 5 tháng 11, 2015

CHOCOLATE BUYING

Những con bò rất thích ăn Sô-cô-la , nên Farmer John quyết định mua một ít cho chúng.
Cửa hàng có N loại sô-cô-la (được đánh số từ 1..N) với số lượng mỗi loại không hạn chế. Loại thứ i có giá P_i($$) và có đúng C_i con bò muốn ăn loại Sô-cô-la ấy. Farmer John có B $$ để mua Sô-cô-la cho lũ bò.
Hỏi số bò tối đa mà Farmer John có thể phục vụ là bao nhiêu ? Biết rằng mỗi con bò chỉ thích một loại sô-cô -la, và nó chỉ được ăn loại sô-cô-la ấy.

Dữ liệu vào: từ tệp văn bản CBUYING.INP

+ Dòng đầu tiên là hai số nguyên N và B.
+ N dòng tiếp theo , dòng thứ i+1 là hai số nguyên dương P_i và C_i.

Dữ liệu ra: ghi vào tệp văn bản CBUYING.OUT

+ Gồm một số duy nhất là kết quả.

Ví dụ:

CBUYING.INP

CBUYING.OUT

5 50

5 3

1 1

10 4

7 2

60 1

8


Giới hạn
1<=N<=10^5
1 <= B <= 10^18
1 <= C_i <= 10^18
1 <= P_i <= 10^18.
Giải thích:
FJ sẽ mua như sau:
+Mua 3 gói sô-cô-la loại 1 mất 3*5= 15$.
+Mua 1 gói sô-cô-la loại 2 mất 1*1= 1$.
+Mua 2 gói sô-cô-la loại 3 mất 2*10= 20$
+Mua 2 gói sô-cô-la loại 4 mất 2*7= 14$.
Tổng cộng hết :15+1+20+14=50$, và FJ đã phục vụ được 8 con bò.

SOLUTION - CODE

MẬT KHẨU

Mỗi người tham dự Olympic Tin học đều phải kích hoạt chương trình cung cấp mật khẩu riêng cho mình để truy nhập vào hệ thống. Khi được kích hoạt, chương trình sẽ đưa ra 2 số nguyên (ở hệ 10). Số thứ hai nhận được từ số thứ nhất bằng cách thay dãy không rỗng các chữ số liên tiếp nhau bằng tổng của chúng. Mật khẩu chính là dãy số tạo thành tổng để ghi vào số thứ 2. 
Ví dụ, 2 số mà chương trình cung cấp là 2148 và 213, số thứ 2 nhận được từ số thứ nhất sau khi thay 148 bằng 1+4+8 (= 13). Nếu đánh số các chữ số trong số thứ nhất bắt đầu từ 1, từ trái sang phải thì mật khẩu được xác định từ dãy các chữ số từ 2 đến 4 của số thứ nhất. 
Yêu cầu: Hãy xác định các vị trí đầu và cuối của dãy số tạo nên mật khẩu. 
Dữ liệu: Vào từ file văn bản PASSWORD.INP, dòng đầu tiên chứa số thứ nhất, dòng tiếp theo – chứa số thứ hai. Các số không bắt đầu bằng 0 và mỗi số có không quá 105 chữ số. 
Kết quả: Đưa ra file văn bản PASSWORD.OUT trên một dòng 2 số nguyên xác định các vị trí đầu và cuối của dãy số tạo nên mật khẩu. Nếu tồn tại nhiều lời giải thì đưa ra lời giải tùy chọn bất kỳ. File liệu đảm bảo có nghiệm. 
Ví dụ: 
PASSWORD.INP
PASSWORD.OUT
2148
213
2 4

SƯU TẬP ĐỒ CỔ

Bình rất thích trò chơi sưu tập đồ cổ. Trò chơi này như sau: Đầu tiên Bình chỉ có một món đồ cổ với độ tuổi 1 ngày. Trong N ngày tiếp theo, ngày thứ  i, cậu ghi lại độ tuổi của món đồ cổ mà mình có sau đó cậu bổ sung thêm một đồ vật có độ tuổi Xi ngày vào bộ sưu tập của mình. Công việc tưởng chừng đơn giản nhưng khi số lượng đồ cổ tăng lên và đặc biệt sau mỗi ngày độ tuổi của món đồ cổ lại tăng lên 1. Bạn hãy viết chương trình giúp Bình xác định độ tuổi của món đồ cổ nhất sau N ngày sưu tập
Dữ liệu vào từ tệp  COLLECTO.INP với cấu trúc như sau
+ Dòng đầu ghhi số N (N≤100000)
+ N dòng tiếp theo, dòng thứ i ghi số Xi
Dữ liệu ra ghi vào tệp COLLECTO.OUT ghi một số duy nhất là độ tuổi của món đồ cổ nhất
Ví dụ:

COLLECTO.INP
COLLECTO.OUT

COLLECTO.INP
COLLECTO.OUT
2
3
1
4

4
1
1
2
2
5

SOLUTION - TEST - CODE

CHUỘT VÀ KHOAI LANG

Trong một mảnh vườn hình chữ nhật có kích thước MxN, người ta chia mảnh vườn thành M hàng và N cột, các hàng và cột tạo thành các ô đơn vị hình vuông có cạnh bằng 1, người ta trồng khoai lang trong những ô đơn vị hình vuông. Trong mảnh vườn này có một chú chuột ở trong hang, chú chuột này cần xác định miền (Hai miền khác nhau không có một cạnh ô vuông nào chung) người ta đã trồng khoai lang có diện tích lớn nhất trong mảnh vườn để đào một đường hầm đến phần diện tích lớn nhất đó. Hãy viết chương trình giúp chú chuột thực hiện công việc đào hầm
Dữ liệu: từ tập tin văn bản CHUOT.INP
+ Dòng đầu tiên ghi 2 số nguyên dương M và N là kích thước của mảnh vườn (1≤M,N≤100).
+ Trong M dòng tiếp theo, mỗi dòng có N ký tự 0 hoặc 1, với ý nghĩa 0 là không trồng khoai lang, 1 là có trồng khoai lang
Kết quả: Ghi vào tập tin văn bản CHUOT.OUT một số nguyên là tổng số dây khoai lang của miền có diện tích lớn nhất (giả sử mỗi ô chỉ có tối đa một dây khoai lang)
Ví dụ:

CHUOT.INP
CHUOT.OUT
6 6
000111
000011
000011
000011
000011
111000
11