Tổng hợp đề thi và code Olympic hay và hữu ích cho sinh viên thử sức, tham khảo.
Trang 1Ngô Đăng Hiền – Học Viện Hải Quân 2011
1
TUYỂN TẬP 1 SỐ ĐỀ THI VÀ CODE CÁC KỲ
THI OLP TIN HỌC SV TOÀN QUỐC
1 CĐ 2005 : Dự trự nước Code : hienclubvn ; vietduc ; AlexBlack
2 CĐ 2005 : Địa đạo Code : hienclubvn ; vietduc; AlexBlack; Sounj
3 KC2005 : Tìm đặc trưng ảnh Code: hienclubvn; vietduc; AlexBlack
4 KC2005: Thám hiểm Code: AlexBlack
5 KC2006: Radar Code: hienclubvn; panaturo; AlexBlack
6 CĐ2006: Siêu mã Code: vietduc
7 Tập thể KC: Tính điểm Code: vietduc ; hienclubvn
8 Tập thể KC: Phân phịng ở Code: hienclubvn ; vietduc
9 KC2008 : Dãy số Code: hienclubvn
10 KC2009 : Đào tạo từ xa Code: vietduc
11 KC2009 : Dãy số Code: Sounj ; hunterphu
12 KC2009: Kết bạn Code: hienclubvn; Vibzz90
13 KC2009: Hiệu chỉnh ảnh đơn sắc Code: hienclubvn
Bài : Dự trữ nước (Cao đẳng 2005)
Ở miền Trung thường năm nào cũng cĩ những đợt hạn hán nên ơng Nam cĩ những thùng
dự trữ nước Do mua làm nhiều đợt nên N (1 ≤ N ≤ 1000) thùng chứa nước của ơng Nam cĩ kích thước khác nhau, mỗi thùng cĩ sức chứa Ci (1 ≤ Ci ≤ 10000, 1 ≤ i ≤ N) Dự đốn rằng năm nay
sẽ cĩ đợt hạn hán lớn nên ơng Nam muốn đổ đầy nước hết các thùng để dự trữ Sau khi kiểm tra ơng Nam thấy rằng cĩ một số thùng vẫn cịn đầy, một số khác thì vơi đi một phần, cịn một số thì
đã hết Ơng quyết định các thùng nào chưa đầy thì sẽ chở đi để đổ đầy nước Nhưng do nơi lấy nước rất xa, và mỗi lần chỉ chở đi được 1 thùng nên ơng quyết định sẽ san nước giữa các thùng với nhau để số thùng phải chở đi là ít nhất
Yêu cầu:
Cho dung lượng nước hiện cĩ của thùng thứ i là Bi (0 ≤ Bi ≤ Ci, 1 ≤ i ≤ N), hãy giúp ơng Nam xác định số lượng thùng ít nhất phải mang đi
Dữ liệu: vào từ file văn bản WATER.INP cĩ dạng sau:
• Dịng thứ nhất ghi một số tự nhiên N là số lượng các thùng nước
• Dịng thứ i trong N dịng tiếp theo mỗi dịng cĩ 2 số nguyên Bi và Ci (0 ≤ Bi ≤ Ci) mơ tả thơng tin thùng thứ i, với Bi là nước cịn trong thùng và Ci là sức
chứa của thùng, các số cách nhau ít nhất một khoảng trắng
Kết quả: ghi ra file văn bản WATER.OUT chứa một số là số lượng ít nhất các
thùng nước tìm được
Kết quả: ghi ra file văn bản WATER.OUT chứa một số là số lượng ít nhất các
thùng nước tìm được
Trang 2Ngô Đăng Hiền – Học Viện Hải Quân 2011
- Ý tưởng : Bài này đi tìm số thùng chưa đầy (hoặc hết), để đem đi
Vậy để số thùng mang đi là nhỏ nhất thì phải ưu tiên mang cái lớn trước
Giải thuật: sắp xếp thứ tự tăng dần
Lấy tổng lượng nước đổ đầy các thùng theo thứ tự từ nhỏ lên lớn, cho đến khi hết Kiểm tra xem thùng nào chưa đầy thì vác đi
// Code của @hienclubvn
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#define input "WATER.INP"
#define output "WATER.OUT"
void Swap(int &a,int &b)
Trang 3Ngô Đăng Hiền – Học Viện Hải Quân 2011
Trang 4Ngô Đăng Hiền – Học Viện Hải Quân 2011
Trang 5Ngô Đăng Hiền – Học Viện Hải Quân 2011
BÀI :ĐỊA ĐẠO (Cao Đẳng 2005)
Trong các cuộc kháng chiến chống xâm lược, cha ơng ta đã xây dựng các địa đạo rất lớn dưới lịng đất với các tuyến đường giao thơng ngầm chằng chịt, vừa bảo đảm an tồn, vừa giữ bí mật tuyệt đối Trong địa đạo này giao thơng đi lại phải tuân thủ các qui định chặt chẽ, tất
cả mọi người đều phải di chuyển dọc theo các tuyến đường và thực hiện nghiêm ngặt các chỉ dẫn giao thơng trên đường
Một trong các địa đạo như vậy bao gồm N đường dọc và M đường ngang được mơ tả như một lưới ơ vuơng kích thước N x M Các đường ngang đánh số từ 0 đến M-1 từ dưới lên trên, các đường dọc đánh số từ 0 đến N-1 từ trái sang phải Tại một số vị trí giao giữa các đường người ta đặt các biển chỉ dẫn dạng ơ vuơng hoặc ơ trịn với ý nghĩa như sau: khi di chuyển theo các đường tại các nút giao thơng, nếu gặp chỉ dẫn ơ vuơng thì bắt buộc rẽ trái, nếu gặp chỉ dẫn ơ trịn thì bắt buộc rẽ phải, cịn nếu khơng cĩ chỉ dẫn thì phải đi thẳng Sơ đồ sau cho ta một hình ảnh các
Trang 6Ngô Đăng Hiền – Học Viện Hải Quân 2011
6
đường của địa đạo và các chỉ dẫn
Bạn cĩ nhiệm vụ dẫn một đồn khách tham quan đi theo các đường của địa đạo, xuất phát từ vị
trí (0,0) và tuân thủ chỉ dẫn tại các nút giao thơng Từ vị trí ban đầu bạn cĩ thể đi theo một
trong hai hướng (ngang hoặc dọc) Đường đi của bạn sẽ dừng lại nếu xảy ra một trong hai tình
huống sau:
1 Khơng thể đi tiếp được nữa
2 Nút giao thơng sắp đến theo hành trình là nút giao thơng đã đi qua
Độ dài của đoạn đường đã đi là tổng số các nút giao thơng đã đi qua kể cả vị trí xuất
phát và vị trí kết thúc
Yêu cầu: tính độ dài của đoạn đường cĩ thể đi được trong địa đạo
Dữ liệu: vào từ file văn bản PIPE.INP cĩ dạng sau:
• Dịng đầu tiên chứa 3 số tự nhiên là N, M và K với N, M là kích thước của
lưới mơ tả địa đạo N, M < 100 K là số lượng các chỉ dẫn cĩ tại các nút giao
thơng trong địa đạo K < 1000 Các số cách nhau bởi dấu cách
• K dịng tiếp theo mơ tả tọa độ và tính chất của các chỉ dẫn tại các nút giao
thơng tương ứng Mỗi dịng bao gồm 3 số nguyên dạng X Y Z Ở đây X, Y là
toạ độ của vị trí biển chỉ dẫn (0 ≤ X ≤ N-1, 0 ≤ Y ≤ M-1), Z nhận giá trị 0
hoặc 1 với ý nghĩa: 0 là chỉ dẫn rẽ phải và 1 là chỉ dẫn rẽ trái Các số cách
nhau bởi dấu cách
Kết quả: ghi ra file văn bản PIPE.OUT bao gồm một dịng chứa đúng 2 số tự nhiên
theo thứ tự tăng dần là độ dài của hai đường đi trong địa đạo xuất phát từ vị trí ban
Trang 7Ngô Đăng Hiền – Học Viện Hải Quân 2011
#define Input "PIPE.INP"
#define Output "PIPE.OUT"
Trang 8Ngô Đăng Hiền – Học Viện Hải Quân 2011
Trang 9Ngô Đăng Hiền – Học Viện Hải Quân 2011
Trang 10Ngô Đăng Hiền – Học Viện Hải Quân 2011
Trang 11Ngô Đăng Hiền – Học Viện Hải Quân 2011
Trang 12Ngô Đăng Hiền – Học Viện Hải Quân 2011
Trang 13Ngô Đăng Hiền – Học Viện Hải Quân 2011
Trang 14Ngô Đăng Hiền – Học Viện Hải Quân 2011
Trang 15Ngô Đăng Hiền – Học Viện Hải Quân 2011
Bài: Tìm đặc trưng ảnh (Ko chuyên 2005)
Một nhĩm nghiên cứu xử lý ảnh của trường ĐH Khoa học tự nhiên, ĐHQG Tp.HCM đang giải quyết bài tốn nhận dạng mặt người trong ảnh Ảnh chụp mặt người sau khi đã xử lý là một bảng vuơng A kích thước N x N (10 ≤ N ≤ 800) với mỗi ơ (I,J) (1 ≤ I, J ≤ N) cĩ giá trị từ 0 đến 255 là mức xám của ảnh tại ơ này (trong đĩ 0 là màu nền) Để xác định vị trí cĩ thể là mặt người, nhĩm cần thống kê các đặc trưng cĩ dạng hình vuơng kích thước K x K (1 ≤ K ≤ 40) trong đĩ tất các các giá trị trong hình vuơng đều phải khác 0
Yêu cầu : Từ một ảnh chụp mặt người, hãy giúp nhĩm nghiên cứu đếm tất cả các đặc trưng
cĩ trong ảnh đĩ
Dữ liệu : Vào từ file văn bản FEATURE.INP trong đĩ :
• Dịng đầu chứa hai sơ N và K
• Dịng thứ I trong N dịng tiếp theo chứa tương ứng dịng thứ I của bảng A
Các số ghi trên một dịng được ghi cách nhau bởi ít nhất một khoảng trắng Mỗi dịng cĩ N số nguyên Dịng thứ I là các giá trị của N phần tử trong dịng thứ I-1 trong bảng vuơng A
Kết quả : Ghi ra file văn bản FEATURE.OUT số lượng đặc trưng tìm được
Trang 16Ngô Đăng Hiền – Học Viện Hải Quân 2011
16
/* Code của @AlexBlack
Ý tưởng: duyệt tồn bộ ma trận, kiểm tra những vùng cĩ diện tích KxK xem cĩ phải là mặt người hay khơng nếu phải thì tăn biến đếm lên
*/
#include<stdio.h>
#define input "FEATURE.INP"
typedef struct Anh
Trang 17Ngô Đăng Hiền – Học Viện Hải Quân 2011
Trang 18Ngô Đăng Hiền – Học Viện Hải Quân 2011
/* Code của @vietduc
dịch từng ơ một rồi check xem nĩ cĩ thỏa mãn hay khơng, nếu cĩ thì ++
Trang 19Ngô Đăng Hiền – Học Viện Hải Quân 2011
Bài: Thám hiểm (Đề Khối Ko Chuyên 2005)
Đồn thám hiểm Nam cực xuất phát từ Trạm nghiên cứu đặt ở điểm cĩ toạ độ (0, 0) Trục
OX chạy từ tây sang đơng, trục OY chạy từ nam lên bắc Ban đầu Đồn đi theo một trong số 4 hướng Đơng (E), Tây (W), Nam (S) hoặc Bắc (N) Sau khi đi một quảng đường là một đơn vị
độ dài Đồn dừng lại thực hiện các đo đạc khảo sát cần thiết và tuỳ theo tình hình thực tế,trưởng đồn sẽ quyết định đi tiếp theo hướng nào Để đánh dấu các điểm trên bản đồ khai thác và dễ dàng xác định đường trở về lịch trình di chuyển trong nhật ký được ghi dưới dạng xâu các ký tự trong tập {E, W, S, N} Tuy vậy thời tiết ở địa cực nổi tiếng là đỏng đảnh Bão tuyết cĩ thể nổi lên bất kỳ lúc nào kèm theo các cơn bão từ làm rối loạn la bàn Khi đĩ đường đi sẽ được ghi nhận bằng các ký tự L - Rẽ trái, R - Rẽ phải, B – Đi ngược lại hướng vừa đi hoặc C - Tiếp tục
đi thẳng theo hướng cũ Mỗi khi bão từ chấm dứt, la bàn hoạt động bình thường trở lại lịch trình di chuyển lại được ghi nhận bằng các ký tự E, W, S, N Ở thời điểm ban đầu của cuộc thám hiểm thời tiết tốt, khơng cĩ bão từ Trong suốt cuộc hành trình cĩ thể khơng cĩ trận bão từ nào hoặc bão từ cĩ thể xẩy ra nhiều lần Ví dụ, lịch trình ở hình bên cĩ thể được ghi nhận bằng xâu WRECSSCRWWCRN
Yêu cầu: Cho một lịch trình di chuyển xác định bởi xâu Z độ dài khơng quá 200 gồm các ký
tự trong tập {E, W, S, N, L ,R, B, C}, bắt đầu bằng một trong số 4 ký tự đầu tiên Hãy tính
khoảng cách theo đường chim bay từ điểm dừng cuối của đồn thám hiểm tớỉ Trạm nghiên
Trang 20Ngô Đăng Hiền – Học Viện Hải Quân 2011
20
cứu mà Đồn xuất phát
Khoảng cách d theo đường chim bay giữa hai điểm cĩ toạ độ (X1, Y1) và (X2,Y2) được tính theo cơng thức
Dữ liệu: Vào từ file văn bản EXPLORE.INP gồm một dịng chứa xâu Z xác định một lịch
trình di chuyển của đồn thám hiểm
Kết quả: Đưa ra file văn bản EXPLORE.OUT một số thực cĩ 3 chữ số sau dấu chấm thập
phân, đĩ là khoảng cách tìm được với dữ liệu vào đã cho
/* Code của @AlexBlack
ta chỉ cần phải tìm tọa độ điểm cuối thơi
ý tưởng là dựa trên 4 nguyên lý cơ bản về hướng đơng tây nam bắc rồi rẽ thì dựa vào 4 hướng đĩ mà tính tốn
lưu vị trí cũ để xét sự tương quan của vị trí mới với vị trí cũ
Trang 21Ngô Đăng Hiền – Học Viện Hải Quân 2011
case 1 South( x, y, ex, ey);break;
case -1 North( x, y, ex, ey);break;
case 0:
switch(y ey)
{
case 1 East( x, y, ex, ey);break;
case -1 West( x, y, ex, ey);break;
case 1 North( x, y, ex, ey);break;
case -1 South( x, y, ex, ey);break;
case 0:
switch(y ey)
{
case 1 West( x, y, ex, ey);break;
case -1 East( x, y, ex, ey);break;
case 1 East( x, y, ex, ey);break;
case -1 West( x, y, ex, ey);break;
case 0:
switch(y ey)
{
case 1 North( x, y, ex, ey);break;
case -1 South( x, y, ex, ey);break;
Trang 22Ngô Đăng Hiền – Học Viện Hải Quân 2011
22
{ case 1 West( x, y, ex, ey);break;
case -1 East( x, y, ex, ey);break;
case 0:
switch(y ey)
{
case 1 South( x, y, ex, ey);break;
case -1 North( x, y, ex, ey);break;
case 'E':East( x, y, ex, ey);break;
case 'W':West( x, y, ex, ey);break;
case 'N':North( x, y, ex, ey);break;
case 'S':South( x, y, ex, ey);break;
case 'L':Left( x, y, ex, ey);break;
case 'R':Right( x, y, ex, ey);break;
case 'C':Continue( x, y, ex, ey);break;
case 'B':Back( x, y, ex, ey);break;
printf("%.1lf",kq);
}
Bài : Radar (Đề Ko chuyên 2006)
Một vùng biển hình chữ nhật được chia lơ thành m hàng được đánh số từ 1 đến m từ trên xuống dưới và n cột được đánh số từ 1 đến n từ trái sang phải Lơ nằm ở vị trí giao của hàng p
Trang 23Ngô Đăng Hiền – Học Viện Hải Quân 2011
23
(1≤ p ≤m) và cột q (1≤ q ≤n) được gọi là lơ cĩ tọa độ (p, q) Để bảo vệ các giàn khoan dầu trên vùng biển này người ta bố trí một số radar tại một số lơ Mỗi radar cĩ khả năng phát hiện tầu thuyền tại chính lơ đĩ và 8 lơ lân cận (4 lơ chung cạnh và 4 lơ chung đỉnh) kể cả trên biên của các lơ này Một lơ trên vùng biển được coi là an tồn nếu tàu từ ngồi vùng biển trên muốn vào trong lơ đĩ thì dù đi theo đường đi như thế nào cũng đều bị ít nhất một radar phát hiện
Yêu cầu: Cho kích thước của vùng biển và vị trí của các lơ được bố trí radar Hãy xác định tổng
số lơ an tồn nằm trong vùng biển này
Dữ liệu: Vào từ tệp văn bản RADAR.INP cĩ định dạng như sau:
• Dịng đầu ghi hai số nguyên dương m và n (1≤ m, n ≤300) là kích thước (hàng và cột) của vùng biển Hai số được ghi cách nhau một dấu cách
• Dịng thứ hai ghi số nguyên k (1 ≤ k ≤ m x n) là số các radar được bố trí
• Trên dịng thứ i trong k dịng tiếp theo ghi hai số nguyên dương p, q (1 ≤ p ≤ m, 1≤ q ≤ n) là tọa
độ lơ bố trí radar thứ i Hai số được ghi cách nhau một dấu cách
Kết quả: Ghi ra tệp văn bản RADAR.OUT một số nguyên dương là tổng số các lơ an tồn trong
Giả sử cĩ vùng n x m và tọa độ các rada
Ta lưu nĩ vào trong mảng kích thước ( n + 2 ) * ( m + 2 )
Ví dụ kích thước 3 x 3 và rada cĩ tọa độ ( 1, 1 )
như thế bình thường vị trí rada là ( 0, 0 ) trong mảng 3 x
3
Bây giờ ta lưu nĩ vào mảng 5 x 5 => tọa độ ( 1 x 1 )
Từ đĩ khi xét các ơ an tồn hay khơng ta tránh phải xét xem rada cĩ nằm trên biên hay khơng
Cách này sẽ tốn chi phí hơn bình thường
int nCol, nRow, nRada;
fstream fin( "input.txt", ios::in );
fin >> nCol >> nRow >> nRada;
Trang 24Ngô Đăng Hiền – Học Viện Hải Quân 2011
24
bool arr[ MAX ][ MAX ];
for( int i = 0; i <= nRow + 1; i++ )
for( int j = 0; j <= nCol + 1; j++ )
arr[xx][yy] = arr[xx][yy - ] arr[xx][ yy + 1 =true;
arr[xx- ][yy- ] arr[xx- ][yy] = arr[xx - ][yy+ ] true;
arr[xx + ][yy- ] = arr[xx+ ][yy] = arr[xx+ ][yy+ ] true;
}
fin.close();
int count = 0;
for( int i = 1; i <= nRow; i++ )
for( int j = 1; j <= nCol; j++ )
/* Code của @hienclubvn
Ý tưởng: Cái nào an tồn cho bằng 1
*/
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#define INPUT "RADAR.INP"
#define OUTPUT "RADAR.OUT"
Trang 25Ngô Đăng Hiền – Học Viện Hải Quân 2011
printf("Tong Cell Safe = %d",SumSafe());
//Ghi vao File
/* Code của @AlexBlack
Ý tưởng : xét những chỗ khơng phải là rada kiểm tra xem chỗ
đĩ cĩ phải là vùng an tồn hay khơng
ở đây mình sử dụng mảng từ 1-m,1-n để bỏ qua việc kiểm tra điều kiện biên
*/
#include<stdio.h>
#define input "water.txt"
typedef struct Rada
{
Trang 26Ngô Đăng Hiền – Học Viện Hải Quân 2011
Trang 27Ngô Đăng Hiền – Học Viện Hải Quân 2011
Bài: SIÊU MÃ(Đề thi CAO ĐẲNG OLP 2006)
Siêu mã là một loại mã cĩ nhiều ứng dụng quan trọng trong lĩnh vực mã hĩa và truyền tin Trong bài này, ta xét bài tốn đơn giản sau đây về siêu mã Cho u và v là hai xâu kí tự khác rỗng cĩ độ dài hữu hạn Xâu u được gọi là xâu con của xâu v nếu u cĩ thể nhận được từ v bằng cách xĩa bớt
ít nhất một kí tự trong v Một tập X các xâu khác rỗng cĩ độ dài hữu hạn được gọi là siêu mã nếu mọi cặp u, v bất kỳ thuộc X, u khơng là xâu con của v và v khơng là xâu con của u
Cho trước một tập X = {x1, x2, , xN} gồm N xâu khác rỗng, mỗi kí tự trong xâu là 0 hoặc 1 Hãy kiểm tra xem X cĩ là một siêu mã hay khơng?
Dữ liệu: vào từ file văn bản HCODE.INP cĩ định dạng như sau:
• Dịng đầu tiên chứa số nguyên dương N (N ≤ 500);
• Dịng thứ i trong N dịng tiếp theo ghi xâu xi của tập X, độ dài của xâu xi khơng quá 15, với i =
1, 2, , N
Trang 28Ngô Đăng Hiền – Học Viện Hải Quân 2011
28
Kết quả: ghi ra file văn bản HCODE.OUT cĩ định dạng như sau:
• Nếu X là siêu mã thì ghi số 1;
• Nếu X khơng là siêu mã thì dịng đầu tiên ghi số 0, dịng thứ hai ghi chỉ số i nhỏ nhất mà hoặc
xi là xâu con của xj hoặc xj là xâu con của xi, với xi, xj thuộc X, 1 ≤ i < j ≤ N