Công cụ trợ giúp: Chương trình MTOOL.EXE trong thư mục chứa đề bài được cung cấp để thử nghiệm thực hiện các phép biến đổi và xác định trạng thái cuối của bảng.. Các hệ thống lập trình
Trang 1ĐỊNH HƯỚNG CHUYÊN MÔN trong đào tạo – bồi dưỡng học sinh năng khiếu Tin học
Phát hiện các nhân tố nổi bật để đào tạo và khai thác nguồn nhân lực đỉnh cao, có tri thức và có tay nghề theo kịp sự phát triển của lý thuyết và yêu cầu của thực tế
Việc đào tạo, bồi dưỡng học sinh giỏi Tin học chịu tác động rất nhiều của hai yếu tố:
Sự phát triển của lý thuyết,
Sự phát triển của công cụ Tin học
Có thể thấy rõ xu hướng dạy và học Tin học cho đến nay chia thành ba giai đoạn:
Giai đoạn I: những năm cuối của thế kỷ XX,
Giai đoạn II: Thập kỷ đầu tiên của thế kỷ XXI,
Giai đoạn III: Thập kỷ thứ 2 của thế kỷ XXI, tức là những năm hiện tại
Ở giai đoạn I, ngành Tin học mới tách ra và phát triển thành một ngành khoa học độc lập Người ta tập trung mọi sức lực vào việc xây dựng nền móng cho một ngành khoa học mới, cố gắng tìm cách để giải quyết được các lớp bài toán truyền thống xuất hiện khi tiếp cận bài toán trên quan điểm toán học Việc nắm vững các kiến thức toán học là điều kiện chủ yếu để giải quyết các bài toán tin học Ngoài ra còn phải lưu ý tới cấc ràng buộc tự nhiên về bộ nhớ nhỏ và tốc
độ tương đối thấp của máy tính lúc bấy giờ Đó là sự tiếp tục của tư duy những năm 70 – 80 của thế kỷ 20
Ví dụ, bài Hình vuông diệu kỳ (Bài 3 ngày 2 IOI 1996) vào thời điểm đó là một bài khó
Hình vuông diệu kỳ
Trang 2Những thành công của khối lập phương kỳ diệu đã là động lực để ông Rubic đề xuất phương án phẳng của trò chơi nổi tiếng này Đó là một bảng gồm 8 hình
vuông xếp thành 2 hàng (xem
hình vẽ)
Trong bài này chúng ta xét
phương án khi mỗi hình vuông
được tô một màu khác nhau Màu
được đánh bằng tám số nguyên
dương đầu tiên (xem hình vẽ)
Cấu hình của bảng được xác định
bằng cách cho màu của các hình
vuông, bắt đầu từ hình ở góc trên
trái và đi theo chiều kim đồng hồ Ví dụ, ở hình bên cấu hình ban đầu của bảng được xác định bởi dãy (1, 2, 3, 4, 5, 6, 7, 8)
Có 3 phép biến đổi cơ sở ký hiệu là „A‟, „B‟ và „C‟ tác động lên bảng:
„A‟: Hoán đổi vị trí 2 dòng trên và dưới,
„B‟: Đẩy vòng tròn cột cuối lên cột đầu,
„C‟: Đẩy vòng tròn theo chiều kim đồng hồ 4 hình vuông ở giữa
Cho một cấu hình cuối của bảng Nhiệm vụ của bạn là viết chương trình xác định dãy phép biến đổi cơ sở đưa bảng từ trạng thái ban đầu nêu ở hình bên về trạng thái cuối đã cho (Bài toán con A) Bạn sẽ nhận thêm 2 điểm thưởng nếu số phép biến đổi trong lời giải của bạn không quá 300
Dữ liệu: vào từ file INPUT.TXT gồm một dòng chứa 8 số nguyên mô tả trạng
thái cuối của bảng
Kết quả: Đưa ra file OUTPUT.OUT, dòng đầu tiên chứa số nguyên L – độ dài
của dãy phép biến đổi Mỗi dòng trong L dòng sau chứa một ký tự - tên phép biến đổi cần thực hiện
Công cụ trợ giúp: Chương trình MTOOL.EXE trong thư mục chứa đề bài được
cung cấp để thử nghiệm thực hiện các phép biến đổi và xác định trạng thái cuối của bảng Lời gọi chương trình có dạng “MTOOL input.txt output.txt”
8 7 6 5
Phép biến đổi B
Phép biến đổi A Phép biến đổi C
Trang 3Phân tích: Số lượng trạng thái khác nhau của bảng là 8! = 40 320 Việc tổ chức
loang và lưu trữ vết loang từ trạng thái ban đầu tới trạng thái đích trong điều kiện hiện nay không phải là một chuyện khó Nhưng vào thời điểm diễn ra kỳ thi, bộ nhớ có thể được sử dụng chỉ là 64KB + 64KB cấp phát động và máy thực hiện thuộc loại 386 thì đó là cả một vấn đề lớn
Chúng ta đã đạt được những kết quả rực rỡ trong thời kỳ này vì đội ngũ giáo viên tin học phần lớn xuất thân từ giáo viên chuyên ngành toán Học sinh của chúng ta được trang bị kiến thức cơ sở về toán khá tốt
Giai đoạn II từ những năm 2001 đến 2007, sự tiến bộ về công nghệ và sự phổ cập của các hệ thống phần mềm tiên tiến đã đưa đến những sự chuyển dịch trong việc đào tạo chuyên gia trong lĩnh vực tin học Điều này dẫn đến những thay đổi trong công tác phát hiện, đào tạo và bồi dưỡng học sinh giỏi tin học
Do đó nội dung thi Tin học Quốc tế cũng có nhiều thay đổi Các kiến thức giải thuật được coi là đỉnh cao trước đây bây giờ đã trở thành “bảng cửu chương”
mà ai cũng phải biết và phải thuộc Những giải thuật phức tạp, ít dùng thì không nhất thiết phải thuộc, nhưng bất cứ ai và lúc nào cũng có thể tra cứu, tìm kiếm chúng trên Internet khi cần thiết Sự thông minh và tính sáng tạo bây giờ phải thể hiện không phải ở chổ bạn thuộc nhiều hay ít các giải thuật khác nhau, cũng không phải bạn cài đặt chúng nhanh tới mức nào Thử thách bây giờ là ở chổ bạn có thể tìm ra những giải pháp hữu hiệu giải quyết một cách có hiệu quả các bài toán các vấn đề có mô hình toán học đơn giản nhưng có kích thước lớn hay không?
Để đạt được mục đích đó người lập trình phải biết tận dụng tối đa khả năng mà phần cứng và hệ điều hành cung cấp Các hệ thống lập trình mới như Free Pascal, Dev C++ (những phiên bản đầu tiên) đã tạo điều kiện để người dùng khai thác được tối đa khả năng của phần cứng
Đáng tiếc là tới tận năm 2007 khi thế giới đã đi hết chặng đường quan trọng này thì chúng ta mới được phép chính thức đặt chân lên mãnh đất đã in đầy dấu
Trang 4chân của những người tiên phong, đi vào con đường vốn bây giờ đã trở thành kỷ niệm đẹp của những người đi trước
Ở giai đoạn III, tức là ở những năm gần đây, trong danh mục yêu cầu đối với người lập trình có thêm các đòi hỏi mới:
Không những bạn phải đứng vững trên nền tảng của phần cứng và hệ thống mà còn phải biết khai thác tối đa khả năng của công cụ lập trình
Cụ thể, bạn phải khai thác được triệt để mặt mạnh của các thư viện của
hệ thống lập trình có trong tay,
Nâng cao tính hoàn thiện của chương trình: chương trình phải cho kết quả
đúng và xử lý có hiệu quả với từng lớp dữ liệu (của bài toán)
Phải biết tạo một chương trình linh hoạt, kết hợp vài loại giải thuật để giải một bài toán vốn rất đơn giản nếu kích thước bé
Trang 5Ví dụ, bài Vườn bách thảo (Thi toàn Liên bang Nga 04/2011)
Trong vườn bách thảo có một khu đất hình chữ nhật kích thước w×h trồng một
loại cây đặc biệt quý hiếm Với mỗi cây người ta làm một lối đi tạo thành hình vuông có cây ở tâm Kích thước hình
vuông phụ thuộc vào vùng bộ rễ của cây
lan tới Nếu tạo hệ tọa độ để khu đất này
có 2 đỉnh đối là (0, 0) và (w, h) thì đỉnh
tất cả các hình vuông đều có tọa độ
nguyên Hai hình vuông bất kỳ không có
phần chung diện tích khác 0, tổng diện
tích các hình vuông có cây đúng bằng
diện tích khu đất, cạnh hình vuông song
song với trục tọa độ
Thời gian trôi đi và cỏ mọc um tùm che
kín các lối đi Người ta cần vẽ bản đồ
khôi phục lại các lối đi để lập trình điều
khiển rô bốt chăm sóc cây
Yêu cầu: Cho w, h, n, xi, yi, trong đó n
là số cây, (xi, yi) – tọa độ cây thứ i (1 ≤ w, h ≤ 1012, 1 ≤ n ≤ 2×105
) Hãy xác định độ dài cạnh hình vuông bao quanh mỗi cây Dữ liệu đảm bảo tồn tại lời giải
Dữ liệu: Vào từ file văn bản GARDEN.INP:
Dòng đầu tiên chứa 3 số nguyên w, h và n,
Dòng thứ i trong n dòng sau chứa 2 số thực xi và yi
Kết quả: Đưa ra file văn bản GARDEN.OUT n số nguyên trên n dòng, dòng
thứ i chứa cạnh hình vuông có tâm là cây thứ i
Phân tích: Để đạt được điểm tối đa cần phải biết tổ chức lưu trữ dữ liệu dưới
dạng đồ thị cây, thực hiện các phép xử lý cây, tổ chức tìm kiếm nhị phân trên trên đó
x
y
11
(w, h)
Trang 6Các hệ thống lập trình như Free Pascal 2.4.4, Dev C++ 4.9.9 đều cung cấp những thư viện khổng lồ hỗ trợ người dùng và đều có thể mang lại những hiệu quả tương đương trong lập trình Tuy vậy C++ nhận được sự lựa chọn đông đảo thí sinh dự thi hơn vì các lý do:
Thư viện chuẩn hộ trợ lập trình của C++ dễ tiếp cận hơn vì có nhiều tài liệu giới thiệu,
Có nhiều phiên bản chương trình dịch miễn phí để những Ban tổ chức cung cấp cho thí sinh,
Ở nhiều nước lấy C++ làm cơ sở giảng dạy ở trường phổ thông,
Trong tương lai, khi lên đại học người ta sẽ dùng C++ là chủ yếu,
Mặt mạnh của Pascal là khả năng thể hiện có cấu trúc trong quá trình triển khai giải thuật không còn là trọng tâm trong nội dung giảng dạy,
C++ cho phép xây dựng chương trình tối ưu, thể hiện các tiểu xảo lập trình
Tuy vậy, C++ cũng có những mặt yếu của nó so với Pascal Ta sẽ nói đến những vấn đề này muộn hơn, khi đề cập tới công cụ lập trình
B – CÔNG CỤ LẬP TRÌNH
Trang bị kiến thức về ngôn ngữ lập trình chưa bao giờ là một vấn đề lớn trong tin học Điều quan trọng là kỹ thuật lập trình và tổ chức dữ liệu Khi đã biết tương đối tốt một ngôn ngữ lập trình thì việc chuyển sang lập trình ở một ngôn ngữ mới khá đơn giản
Bên cạnh ngôn ngữ truyền thống PASCAL với hệ thống lập trình Free Pascal và C++ với hệ thống lập trình DEV C++, nhiều nước còn cho phép và khuyến khích sử dụng một loạt các ngôn ngữ khác như Delphi, Python, Java, C#, v v
Đương nhiên, khi chọn một ngôn ngữ nào đó làm công cụ cho mình người lập trình cần phải:
Biết rõ những điểm mạnh và yếu của ngôn ngữ cũng như của hệ thống hệ thống lập trình hỗ trợ,
Cần nắm vững các dịch vụ mà hệ thống lập trình cung cấp,
Cần có thói quen suy nghĩ và hành động phù hợp với ngôn ngữ và hệ thống lập trình,
Cần biết càng sâu càng tốt các thư viện chuẩn hỗ trợ lập trình và biết
khai thác chúng một cách tối ưu
Trang 7Nếu có cách tiếp cận hợp lý thì những vấn đề trên có thể giải quyết được một cách khá đơn giản và hiệu quả
Ở nước ta, trong bậc PTTH hệ thống lập trình được sử dụng phổ biến là ngôn ngữ PASCAL với hệ thống lập trình Free Pascal Ở bậc đại học, ngôn ngữ lập trình chủ yếu là C/C++ với hệ thống Dev C++
Trên thế giới nhiều nước sử dụng C++ với các hệ thống lập trình Dev C++ hoặc tương đươngngay từ bậc phổ thông trung học
Việc giảng dạy đại trà trong nhà trường không phải là vấn đề thảo luận ở đây Nhưng việc trang bị công cụ cho học sinh năng khiếu , phục vụ cho các kỳ thi Tin học là vấn đề nằm trong tầm xem xét và xử lý của chúng ta
Các thành phần và cấu trúc tương đương của 2 hệ thống lập trình Các phép tính số học
Trang 9Z[n-i]-=c;
}
Đặt điều kiện trong ngoặc
}
for (i=n;i>0;i ) {
}
Trang 10Tổ chức chu trình có số lần lặp không biết trước
Phần đầu chương trình
Ở PASCAL có thể có hoặc không có phần đầu chương trình:
Ở C++: bắt buộc phải khai báo các thư viện:
while (i<j) {
}
Khai báo thư viện,
thừa không sao!
Trang 11Tổ chức vào ra với file văn bản
Chương trình con và chương trình chính
fi>>a>>b>>c;
fi.close();
fo<<a<<” “<<b<<endl;
return(k);
} int main() { }
Trang 12if (t>0) {k++;a[i]=t;
} else a[i]=0;
} } fo<<k<<endl;
if (k>0) for (long i= 1; i<=n;i++) if (a[i]>0) fo<<i << " "<<a[i]<<endl; fi.close(); fo.close();
} }
Trang 13Xâu là một trong các loại dữ liệu cơ bản mà các hệ thống lập trình đều phải cung cấp địch vụ để khai báo, lưu trữ và xử lý
Cả trong PASCAL và C++ đều có 2 loại xâu:
Trong PASCAL:
o Xâu kiểu string (ngắn và dài),
o Xâu kiểu Pchar trong hệ thống lập trình Free Pascal,
Trang 15PASCAL cũng cung cấp những dịch vụ tương tự trong thư viện Strings Dưới đây là vài ví dụ nêu trong tài liệu hướng dẫn sử dụng của Free Pascal
PASCAL
Program Example13 ;
Uses s t r i n g s ;
{ Program to demonstrate the StrScan and StrRScan f u n c t i o n s }
Const P : PChar = ’ This i s a PCHAR s t r i n g ’ ;
S : Char = ’ s ’ ;
begin
Writeln ( ’P , s t a r t i n g from f i r s t ’ ’ s ’ ’ : ’ ,StrScan (P, s ) ) ;
Writeln ( ’P , s t a r t i n g from l a s t ’ ’ s ’ ’ : ’ ,StrRScan (P, s ) ) ;
{ Program to demonstrate the StrLower and StrUpper f u n c t i o n s }
Trang 16Như vậy, việc dùng PASCAL hay C++ đều có thể giải quyết một cách hiệu quả
các bài toán thi học sinh giỏi Tuy vậy, trong mọi trường hợp, học sinh cần được:
Trang bị thêm các kiến thức mới ,
Có thói quen khai thác các công cụ trong hệ thống lập trình,
Biết cách sử dụng hợp lý và có hiệu quả các công cụ hiện có
Đã là một công dạy và học, tại sao ta không làm việc ngay với C++? Điều này
là hoàn toàn khả thi và có lợi vì:
Về mặt pháp lý:
o Bộ Giáo dục cho phép sử dụng C/C++ trong kỳ thi,
o Công cụ: cũng thuộc loại Open Sources ( miễn phí ),
Về thời gian:
o 02 tiết cho việc giới thiệu cách viết chương trình trên C++,
o 02 tiết cho việc làm quen với môi trường lập trình Dev C++,
o Các kiến thức khác, nếu cần, trang bị dần trong suốt quá trình bồi dưỡng (theo nguyên tắc “ Mưa dầm thấm đất ”),
Lợi ích:
o Thư viện chuẩn STL của C++ có nhiều dịch vụ cần thiết với học sinh (ví dụ như các công cụ sắp xếp theo các giải thuật khác nhau, các công cụ tìm kiếm, tổ chức stack, heap, xử lý vector, ma trận v
{ Program to demonstrate the StrPos f u n c t i o n }
Trang 17 Về mục tiêu chiến lược lâu dài:
o Các kiến thức về kỹ năng lập trình sẽ được tận dụng triệt để trong tương lai khi học sinh lên đại học và ra làm việc,
o Đáp ứng yêu cầu về chiến lược đào tạo và nâng cao chất lượng
Giáo dục của nhà nước
Tất nhiên PASCAL với hệ thống lập trình Free Pascal vẫn được sử dụng song song như một tùy chọn cho những người yêu thích và vẫn hoàn toàn có thể đạt kết quả cao trong các kỳ thi
Các vấn đề cần lưu ý khi chuyển đổi công cụ
Trong thời gian đầu cần trợ giúp học sinh các vấn đề:
Các loại lỗi cú pháp thường gặp ở giai đoạn đầu,
Cách tạo file dữ liệu,
Kỹ thuật cục bộ hóa biến,
Khai thác giao diện của Dev C++ và các công cụ hiệu chỉnh,
Vấn đề biến đổi kiểu dữ liệu trong biểu thức,
Giới thiệu về sự tồn tại và tác dụng của một số thư viện trong STL
Tránh trang bị dồn dập kiến thức mới, đặc biệt là về các thư viện Phong cách lập trình theo kiểu C++ sẽ tự động được hình thành dần theo thời gian, đúng với
tinh thần “Trăng đến rằm sẽ tròn”
Các vấn đề này sẽ được xem xét ở các phần tiếp theo
Trang 18SẮP XẾP
Hàm sắp xếp nhanh trên C++
void quickSort( int arr[], int left, int right) {
int i = left, j = right;
Trong nhiều trường hợp thường phải sắp xếp đồng thời 2 dãy Chỉ số CS và Giá
trị B, tức là sắp xếp cặp (csi, bi) theo giá trị tăng dần của bi và với những bibằng nhau cặp (csi, bi) có csi nhỏ hơn sẽ đứng trước
SẮP XẾP 2 DÃY
Ta có thể dễ dàng bổ sung mở rộng hàm sắp xếp nêu trên để giải quyết vấn đề này Tuy vậy, để tận dụng tối đa các khả năng sắp xếp khác nhau do hệ thống lập trình cung cấp ta cần tổ chức dữ liệu theo kiểu véc tơ, heap Chương trình sắp xếp sẽ có dạng:
Chương trình trên C chuẩn:
1 5 7 3 14 7 26 12
Xử lý đệ quy các nhóm
2
1 3 5 7 7 12 14 26
Trang 19{
int val, idx; //val: b[i], idx: cs[i]
}Element;
typedef Element Arr[MAX];
int cmpf(const void *a, const void *b);
for (int i=0; i<n; i++)
printf("%d %d\n", a[i].val, a[i].idx);
Trang 20typedef class CArr
Ghi chú: Nội dung của phần sắp xếp và sắp xếp 2 dãy được biên soạn theo tài liệu của thầy
Nguyễn Thanh Sơn, trường Phổ thông Năng khiếu , Đại học Quốc gia Thành phố Hồ Chí
Minh
Trang 21BÀI TẬP VÀ CHƯƠNG TRÌNH
Để hỗ trợ cho việc triển khai giảng dạy trên C++ các bài tập dưới đây sẽ được giới thiệu kèm theo với lời giải trên ngôn ngữ C/C++ và Pascal (dựa trên cơ sở hệ thống lập trình Free Pascal) Khi đã có đủ tự tin trong việc lập trình ta sẽ thấy lời giải đưa ra dưới dạng chương trình hoàn thiện chỉ có tác dụng chủ yếu để tạo tests
Việc trình bày giải thuật dưới dạng sơ đồ khối cũng không giúp nhiều cho việc nắm bắt giải
thuật mà chỉ hỗ trợ cho việc viết chương trình (coding) được dễ dàng Ngoài ra, sơ đồ khối
còn hạn chế tính sáng tạo trong việc triển khai giải thuật
Với mỗi bài toán, quan trọng và cần thiết hơn cả là gợi ý về giải thuật, bao gồm:
Hướng triển khai giải thuật,
Cần có những dữ liệu gì, tổ chức như thế nào, giá trị đầu, cách biến đổi, dẫn xuất,
Những điểm đặc biệt cần lưu ý,
Đánh giá độ phức tạp,
Với một vài khâu xử lý quan trọng: có thể dẫn xuất câu lệnh hoặc đoạn chương trình
Việc dẫn xuất đầy đủ chương trình cũng rất cần thiết, nhưng chỉ ở giai đoạn đầu của quá trình đào tạo, bồi dưỡng học sinh
Việc tổ chức gợi ý giải thuật còn mất nhiều thời gian và công sức hơn cả việc trực tiếp viết chương trình giải!
Tuyệt đối tránh cung cấp cho học sinh chương trình hoàn thiện ngay từ đầu, khi học sinh chưa hiểu giải thuật, chưa bắt tay tự mình lập trình
Lời giải cho các bài tập ở phần đầu được đưa ra ở dạng song ngữ Ở nửa cuối của phần bài tập, khi đã có đủ kinh nghiệm với C++, các lời giải chỉ đưa ra ở dạng chương trình trên C++ hoặc C/C++
Trang 22TẬP CON Tên chương trình: SUBSETS.???
Cho 2 tập số nguyên X={x 1 , x 2 , , x m } và Y={y 1 , y 2 , , y n}, trong đó:
x 1 < x 2 < < x m,
y 1 < y 2 < < y n
Nói X có thứ tự từ điển nhỏ hơn Y nếu thỏa mãn một trong hai điều kiện:
i sao cho x 1 = y 1 , x 2 = y 2 , , x i-1 = y i-1 , x i < y i,
m < n và x 1 = y 1 , x 2 = y 2 , , x m = y m
Xét tập số nguyên {1, 2, , n} Từ tập này người ta có thể trích ra các tập con, trong mỗi tập
con các phần tử được liệt kê theo thứ tự tăng dần của giá trị và sắp xếp các tập con nhận được theo thứ tự tự điển tăng dần Các tập con được đánh số bắt đầu từ 1
Yêu cầu: Cho hai số nguyên n và k (1 < n ≤ 60, 1 ≤ k ≤ 260-1) Hãy xác định tập con thứ k
Dữ liệu: Vào từ file văn bản SUBSETS.INP gồm nhiều tets, mỗi test cho trên một dòng chứa
Trang 23for (int i=n-1; i>=0;i ) { t=(t1<<i)&k;
if ( t==0) {d[n-i]=1; if (k==0) break;k ;}
else d[n-i]=0;
} for (int i=1;i<=n;i++) if (d[i]==1) fo<<i<<" ";
fo<<endl;
} int main() { while (! fi.eof()) { fi>>n>>k;
//if (n==0) break;
xly();
} fi.close();
fo.close();
}
Trang 25INTERNET Tên chương trình: INTERNET.???
Giá truy cập internet phụ thuộc vào từng thời điểm trong tuần Các ngày trong tuần được
đánh số từ 1 đến 7 bắt đầu từ thứ 2 Bảng tính giá gồm n bản ghi (1 ≤ n ≤ 100), sắp xếp theo
thứ tự tăng dần của thời gian, mỗi bản ghi có dạng:
d cc:mm v
trong đó d là ngày trong tuần, cc – 2 số chỉ giờ (chế độ 24 giờ), mm – 2 số chỉ phút, v – giá mỗi phút truy nhập, là số nguyên (1 ≤ v ≤ 104) Giá truy nhập được giữ nguyên cho đến khi
gặp thời điểm mới ở bản ghi tiếp theo trong bảng Sau bản ghi thứ n là bảng ghi số 1
Yêu cầu: Cho bảng tính giá và danh sách xác định m phiên truy nhập mạng (1 ≤ m ≤ 105)
Mỗi phần tử của danh sách có dạng d cc:mm t, trong đó d, cc, mm có ý nghĩa như trong bảng giá, t – thời gian truy nhập tính theo phút, là số nguyên (1 ≤ t ≤ 109) Các phiên truy nhập có thể thuộc những tuần khác nhau Hãy tính chi phí “lướt” mạng
Dữ liệu: Vào từ file văn bản INTERNET.INP:
Dòng đầu tiên chứa 2 số nguyên n và m,
Mỗi dòng trong n dòng tiếp theo chứa một bảng ghi của bảng giá,
Ở m dòng cuối cùng mỗi dòng chứa một bản ghi về một phiên truy nhập
Kết quả: Đưa ra file văn bản INTERNET.OUT một số nguyên – chi phí phải trả
Trang 26for (int i=1;i<=10080;++i)
{if (a[i]!=0) v=a[i];
Trang 2828/64
Hồi còn bé Steve được tặng một đồ chơi gọi là bánh xe may mắn Đó là một cái đĩa có thể quay theo
chiều kim đồng hồ Vành của đĩa được chia thành n phần bằng nhau, trên mỗi phần có thể ghi một
chữ cái latinh in hoa Bên ngoài có một kim chỉ đến chữ cái
khi bánh xe dừng Thiết kế đồ chơi đảm bảo để kim không
bao giờ chỉ đúng vào vạch phân chia Cứ mỗi lần kim chạm
vào vạch phân chia lại có một tiếng chuông rất êm tai và bộ
đếm số tiếng chuông ở tâm bánh xe lại tăng thêm 1 Để bắt
đầu quay bánh xe người ta phải lắc nhẹ nó rồi mới quay được
và khi lắc bộ đếm trở về 0
Steve rất thích thú và chơi rất nhiều lần Steve không bao giờ
ghi các chữ cái trùng nhau trên vành bánh xe
Thông thường, với một bộ các chữ cái ghi trên vành bánh xe
Steve chơi k lần liên tiếp, sau mỗi lấn quay Steve ghi lại số
hiển thị ở tâm và chữ cái mà mũi tên chỉ tới
Điều đó diễn ra đã lâu lắm rồi Cây cối trong công viên thành
phố đã nhiều lần thay lá Chiếc đồ chơi xinh xắn đã thất lạc đâu đó Một lần tình cờ Steve tìm thấy mảnh giấy cũ ghi lại kết quả chơi Những kỷ niệm đẹp của thời thơ ấu êm dịu, vô tư lự chợt trào lên như những đợt sóng lừng và Steve không cưỡng nỗi ý nghĩ phải khôi phục lại dòng chữ đã viết trên bánh xe Tuy vậy, cũng không loại trừ khả năng do vội vàng, kết quả đã bị ghi sai (ai mà ngờ được mẫu giấy này lại có giá trị như vậy trong tương lai!) do đó không xác định được những gì đã ghi trên bánh xe Ngoài ra, kết quả lần chơi này cũng có thể khá nghèo nàn, không đủ thông tin để xác định hết các chữ cái đã ghi trên bánh xe
chỉ ở lượt quay này (2 ≤ n ≤ 25, 1 ≤ k ≤ 100, i = 1 ÷ k) Hãy xác định dòng chữ ghi trên vành bánh
xe kể từ ký tự lần cuối cùng được kim chỉ tới Nếu thông tin mâu thuẫn thì đưa raxâu chỉ chứa một ký
tự “!” Nếu một số ký tự không đủ thông tin để xác định thì vào vị trí đó trong xâu đưa ra ký tự “?”
Dữ liệu: Vào từ file văn bản WHEEL.INP:
Dòng đầu tiên chứa 2 số nguyên n và k,
Dòng thứ i trong k dòng sau chứa 2 giá trị m i và c i
Kết quả: Đưa ra file văn bản WHEEL.OUT xâu xác định được
V
R
9
Trang 30readln(fi,n,k);
s:=''; err:=0; v:=n;
for i:= 1 to n do s:=s+'?';
for i:=1 to k do begin
readln(fi,m,c0,c);
v:=v-m; if v<=0 then v:=v+n;
if ((s[v]<>'?') and (s[v]<>c)) then begin err:=1; s:='!'; break end; s[v]:=c
end;
assign(fo,tfo); rewrite(fo);
if err=0 then begin s:=s+s; s:=copy(s,v,n) end; write(fo,s);
close(fi); close(fo) END
Trang 31GHI TA Tên chương trình: GUITAR.???
Trong cuộc thi sáng tạo rô bốt Steve đã trình diễn rô bốt chơi ghi ta của mình, một rô bốt, theo lời mô tả của tác giả “có đến hàng tỷ ngón tay”!
Đàn ghi ta có 6 dây đánh số từ 1 đến 6 và có p phím đánh số từ
1 đến p Khi chơi nhạc người ta gẩy dây và bấm phím để có các
giai điệu khác nhau Với mỗi dây, nếu có nhiều phím cùng
được bấm thì âm điệu sẽ được quyết định bởi phím có số cao
nhất Ví dụ, âm điệu khi gẩy dây số 3 và bấm đồng thời các
phím 5 và 7 sẽ giống như khi ta gẩy dây này và chỉ bấm phím
số 7
Điều khó khăn nhất khi biểu diễn một bài nhạc là điều khiển
cường độ tức phải gẩy dây nào và bấm phím nào, còn điều
khiển trường độ (thời gian phát một nốt) không phải là quá khó
về phương diện kỹ thuật Chương trình điều khiển cường độ
của Steve được tối ưu hóa theo hướng giảm số lần chuyển tay
bấm phím xuống còn ít nhất
Xét bản nhạc có n nốt, nốt thứ i được cho bởi cặp giá trị
nguyên (s i , f i ), trong đó s i – dây cần gẩy và f i – phím cần
bấm phím 5, tất cả là 7 thao tác, thực hiện trên dây số 2
, i = 1 ÷ n) Hãy xác định số
thao tác bấm phím ít nhất cần thực hiện
Dữ liệu: Vào từ file văn bản GUITAR.INP:
Dòng đầu tiên chứa 2 số nguyên n và p,
Dòng thứ i trong n dòng sau chứa 2 số nguyên s i và f i
Kết quả: Đưa ra file văn bản GUITAR.OUT một số nguyên – số thao tác bấm phím ít nhất
Trang 32while a[s,k]>f do begin dec(k); inc(r) end;
if a[s,k]<f then begin inc(k);a[s,k]:=f; inc(r) end