Tuyển tập đề thi học sinh giỏi tin học của thầy hùng biên soạn có hướng dẫn

47 1.6K 14
Tuyển tập đề thi học sinh giỏi tin học của thầy hùng biên soạn có hướng dẫn

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Năm học 2002-2003 Bài 1: CHỮ SỐ tên file chương trình CHUSO.PAS Xét dãy số tự nhiên {an} đuợc xây dựng theo quy tắc sau: • Cho trước số a0 số tự nhiên có tối đa 10 chữ số • Số (i>0) số tự nhiên nhận từ a i-1 cách viết thêm vào sau chữ số ai-1 ai-1 viết theo thứ tự ngược lại Ví dụ: Với a0 = 123 a1 = 123321, a2 = 123321123321, a3 = 123321123321123321123321 Với hai số N M cho trước, tìm chữ số thứ M aN Dữ liệu cho file văn với tên CHUSO.INP dòng đầu chứa số a 0, dòng thứ hai chứa hai số N M Kết ghi file văn với tên CHUSO.OUT Trong trường hợp có lời giải, file chứa số tìm được, ngược lại file chứa số -1 Ví dụ: CHUSO.INP CHUSO.OUT 123 37 Giới hạn: ≤ N ≤ 25, ≤ M ≤ 000 000 000 Lời giải: Trước tiên ta nhận xét đề cho a0 số tự nhiên, tốn khơng sử dụng tính chất số nên ta xem a0 xâu ký tự Gọi L số ký tự a0, ta thấy a0 có L ký tự, a1 có 2L ký tự, a2 có 4L ký tự, , aN có 2NL ký tự Ký hiệu sR chuỗi ký tự đảo ngược chuỗi s Ví dụ: s="abca" s R ="acba", chữ viết theo thứ tự ngược lại Để ý với hai chuỗi a, b ta có (ab)R=bRaR Theo đề bài, ta có a1 = a0a0R, a2=a1a1R=a0a0R(a0a0R)R=a0a0Ra0a0R, , aN= a0a0Ra0a0R a0a0R, nghĩa xâu aN ghép thành từ xâu a0 a0R xen kẽ Từ nhận xét ta có thuật tốn sau: Nếu vị trí M nằm ngồi xâu ký tự a N, hay nói cách khác M < M > NL in -1 Đoạn lệnh sau thể điều này: if (ml*(1 shl n)) then begin {chú ý: shl n = 2^n} timchuso:=-1; exit; end; Cịn khơng, ta xem vị trí M thuộc xâu a hay xâu đảo ngược a0R, điều giá trị biểu thức ((M-1) div L) mod hay Biết điều này, sử dụng phép lấy số dư, ta tìm vị trí ký tự cần tìm chuỗi a0: i:=(m-1) mod l+1; {i vị trí tương ứng với vị trí M chuỗi a0} if ((m-1) div l) mod 2=1 then i:=l-i+1; ta đảo ngược vị trí i} {nếu vị trí M thuộc xâu đảo ngược a 0R timchuso:=ord(a0[i])-ord('0'); {kết chữ số a0[i]} Chương trình: const finp='chuso.inp'; fout='chuso.out'; var a0: string; n, m: longint; function timchuso(n,m: longint): longint; var l, i: longint; begin l:=length(a0); if (ml*(1 shl n)) then begin timchuso:=-1; exit; end; i:=(m-1) mod l+1; if ((m-1) div l) mod 2=1 then i:=l-i+1; timchuso:=ord(a0[i])-ord('0'); end; begin assign(input, finp); reset(input); assign(output, fout); rewrite(output); readln(a0); readln(n,m); write(timchuso(n,m)); close(input); close(output); end Bài 2: TÍNH DIỆN TÍCH tên file chương trình HCN.PAS Trên mặt phẳng tọa độ cho N (N ≤ 10 000) hình chữ nhật với cạnh song song với trục tọa độ Các hình chữ nhật đánh số từ tới N Hình chữ nhật thứ i cho toạ độ đỉnh trái (xi1 , yi1) tọa độ đỉnh phải (xi2, yi2) Các số xi1 , yi1, xi2, yi2 số nguyên phạm vi từ -100 đến 100 Hãy lập trình tính: Diện tích phần mặt phẳng mà N hình chữ nhật phủ Tính diện tích phần chung N hình chữ nhật Dữ liệu cho file HCN.INP dịng đầu chứa số N Dịng thứ i N dòng chứa số số xi1 , yi1, xi2, yi2 Kết ghi file HCN.OUT gồm dịng, dịng đầu chứa số S kết câu Dòng thứ hai chứa số S2 kết câu 2 Ví dụ: HCN.INP 0011 -1 -1 1 HCN.OUT Bài 3: BẢNG QUẢNG CÁO Tên file chương trình QUANGCAO.PAS Trên quảng trường trung tâm thủ Rome có bảng quảng cáo hình chữ nhật gồm N x M vng Mỗi có bóng đèn, bóng đèn có hai trạng thái tắt sáng Ứng với dịng cột có công tắc Khi tác động đến công tắc tất bóng đèn dịng cột tương ứng đổi sang trạng thái ngược lại (đang sáng thành tắc, tắc bật sáng) Để mừng đội nhà thắng trận trận cầu chiều qua người phụ trách bảng quảng cáo muốn bảng có nhiều bóng đèn sáng nhất.Với trạng thái bảng quảng cáo thời cho trước, người phụ trách nhờ bạn lập trình tìm phương án tác động lên cơng tắc để nhận trạng thái bảng quảng cáo mong muốn Bạn giúp nhà phụ trách thực điều Dữ liệu cho file văn với tên QUANGCAO.INP đó: • Dịng đầu chứa hai số N M (: ≤ N ≤ 10, ≤ M ≤ 100) • Dịng thứ i N dòng chứa M số Số thứ j cho biết trạng thái bóng đèn thứ j dòng thứ i bảng (1 tương ứng với bóng đèn sáng, tương ứng với bóng đèn tắt) Kết ghi file QUANGCAO.OUT đó: • Dịng đầu số bóng đèn sáng bảng tìm • Dịng thứ hai chứa S số lần bạn tác động lên cơng tắc • S dịng ghi S cơng tắc theo trình tự cần bật Dịng thứ j S dịng chứa xâu độ dài khơng q 4, ký tự đầu ‘D’ ‘C’ tương ứng với tác động thứ i lên dòng hay cột Phần lại xâu số dòng hay cột tương ứng Ví dụ: QUANGCAO.INP QUANGCAO.OUT 16 1001 0110 C1 0110 C4 1001 D1 D4 Lời giải: Trước hết ta đưa hai nhận xét: • • Mỗi công tắc cần tác động nhiều lần: thật vậy, tác động công tắc lần cho kết giống không tác động lên công tắc Thứ tự tác động lên cơng tắc khơng quan trọng Nói cách khác, tác động dãy cơng tắc theo trình tự mang lại kết Từ hai nhận xét trên, ta thấy cơng tắc có hai khả năng: tác động khơng tác động Có tất M+N công tắc, số khả 2M+N Theo giới hạn đề ra, số lớn Tuy nhiên để tìm số bóng đèn sáng nhiều nhất, ta cần duyệt qua 2N ≤ 210 = 1024 khả tác động lên công tắc hàng bảng Với khả này, cột ta khẳng định có cần phải tác động lên công tắc cột hay khơng: tác động lên cơng tắc cột mà số đèn sáng cột nhiều ta tác động Đoạn lệnh sau thể điều Chú ý chương trình đây, ta đánh số cột, hàng for j:=0 to m-1 begin dem:=0; {đếm số đèn sáng cột j} for i:=0 to n-1 if (b[i,j]=1) then inc(dem); if (demn) or (j>n); {vượt phạm vi bảng} if (s>kq) then kq:=s; {cập nhật kết quả} end; Chương trình: const MAXN=105; finp='sum.inp'; fout='sum.out'; var n, i, j, t, s, kq: longint; a: array[1 MAXN, MAXN] of longint; begin assign(input, finp); reset(input); assign(output, fout); rewrite(output); readln(n); for i:=1 to n for j:=1 to n read(a[i,j]); kq:=-maxlongint; for t:=1-n to n-1 begin if (t>=0) then j:=1 else j:=1-t; s:=0; repeat s:=s+a[j+t,j]; inc(j); until (j+t>n) or (j>n); if (s>kq) then kq:=s; end; writeln(kq); close(input); close(output); end Bài 2: SẮP XẾP Tên chương trình: SORT.PAS Cho dãy X gồm N số nguyên phạm vi từ -10000 đến 10000 (1 ≤ N ≤ 100000) Hãy xếp dãy số theo thứ tự giảm dần Dữ liệu vào cho file văn SORT.INP dòng đầu chứa số N Dòng thứ i N dòng chứa số thứ i dãy X Kết ghi file văn với tên SORT.OUT ghi phần tử dãy X xếp số dịng Ví dụ: SORT.INP SORT.OUT 4 2 Lời giải: Phương pháp xếp mà dùng xếp đếm (counting sort) Phương pháp tận dụng việc giới hạn số cần xếp lưu đủ nhớ, toán phạm vi số -10000 10000 Ta dùng mảng dem[10000 10000] dem[x] lưu số lần xuất số x dãy số Bài toán với yêu cầu làm trình biên dịch Borland Pascal Với trình biên dịch cũ này, quản lý nhớ điều quan trọng dung lượng nhớ bị hạn chế Chúng tơi trình bày lời giải tốn sở nhớ hạn chế Do số xuất đến N ≤ 100 000 lần nên mảng dem phải mang kiểu liệu longint (số nguyên 32 bit) Pascal Trong Borland Pascal, khai báo mảng 20000 phần tử longint bị báo lỗi khơng đủ nhớ Có cách để giải điều này: Khai bảo mảng dem với kiểu liệu word (có giới hạn từ 65535) sau: var dem: array[-10000 10000] of word; Ta nhận xét có nhiều phần tử mang dem có giá trị lớn 60000, tổng số lượng số nhiều 100 000 Do ta quản lý thêm biến lưu phần tử đặc biệt có giá trị đếm vượt 60000 (nếu có) Ta đặt tên biến v Đoạn lệnh đọc vào số quản lý liệu: for i:=1 to n begin readln(x); {đọc vào số x} inc(dem[x]); {tăng biến đếm số lần xuất số x} if (dem[x]=60000) then {nếu có 60000 số x xuất hiện} begin v:=x; {lưu lại số x này} dem[x]:=0; {gán lại biến đếm để tránh tràn số} end; end; Đoạn lệnh in số xếp theo thứ tự giảm dần: for i:=-10000 downto 10000 {duyệt qua phạm vi số: [-10000,10000]) begin for j:=1 to dem[i] {in số i với số lần dem[i]} writeln(i); if (v=i) then for j:=1 to 60000 {nếu i số đặc biệt ta cần in thêm 60000 lần xuất nữa} writeln(i); end; Chương trình: const finp='sort.inp'; fout='sort.out'; var dem: array[-10000 10000] of word; n, i, v: longint; begin assign(input,finp); reset(input); assign(output,fout); rewrite(output); fillchar(dem,sizeof(dem),0); readln(n); 10 var max1,max2,max3,min1,min2,x,i,n:longint; kq:int64; function max(a,b:longint):longint; begin if a>b then max:=a else max:=b; end; begin assign(input,finp); reset(input); assign(output,fout); rewrite(output); max1:=-maxlongint; max2:=max1; max3:=max1; readln(n); for i:=1 to n begin read(x); if (x>=max1) then begin max3:=max2; max2:=max1; max1:=x; end else if (x>=max2) then begin max3:=max2; max2:=x; end else if (x>=max3) then begin max3:=x; end; if (x

Ngày đăng: 11/10/2015, 07:10

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan