Đội ôn thi tin học trẻ không chuyên năm 2012

Status
Không mở trả lời sau này.
M

mikelhpdatke

Mình bây giờ bài tập trên mạng tìm thấy nhiều vô kể. Vù đầu vào máy tính không làm hết. Cái bài trên của mình dùng quay lui là ổn. Cho các bác đề thi Đà Nẵng năm nay. Nói chung đề này dễ.
Đề sưu tầm trên VNZ :))


Đề này gồm có 4 bài trong 2 trang
Tổng quan đề thi
Bài 1
Bài 2
Bài 3
Bài 4
Tên bài làm
BL1.PAS
BL2.PAS
BL3.PAS
BL4.PAS
Dữ liệu vào
Từ bàn phím
Từ bàn phím
MESS.INP
EXP.INP
Dữ liệu ra
Trên màn hình
Trên màn hình
MESS.OUT
EXP.OUT
Chú ý: Trên thư mục gốc của ổ đĩa do hội đồng thi qui định, thí sinh hãy tạo thư mục có tên là số báo danh của thí sinh(ví dụ: Thí sinh mang số báo danh 20015 thì tạo thư mục có tên là 20015). Tất cả bài làm của thí sinh phải lưu vào thư mục này.

Bài 1: (20đ)
Nhập từ bàn phím một số nguyên dương N (3 ≤ N ≤ 1000000000). In ra màn hình số nguyên dương M lớn nhất sao cho M <và N chia hết cho M.
Ví dụ: Nhập: N = 12
In ra màn hình: M = 4
Bài 2: (20đ)
Nhập từ bàn phím một sâu kí tự. In ra màn hình số lượng các kí tự kiểu số trong xâu đã nhập.
Ví dụ:
Nhập: 1234aaaa12a
In ra màn hình: 6
Bài 3: (20đ) Giải mã thông điệp.
Mỗi từ trong ngôn ngữ lập trình được xem là một dãy kí tự liên tiếp nhau và không chứa kí tự trống (dấu cách). Một xâu kí tự có thể có nhiều hơn một từ, mỗi từ trong một xâu kí tự phải cách nhau ít nhất một kí tự trống.
Ví dụ: Cho xâu kí tự S: “Thanh Pho Da Nang”
Xâu S gồm có 4 từ được xác định như sau:

Thứ tự của từ trong xâu S
Từ
1
Thanh
2
Pho
3
Da
4
Nang
Hai người bạn A và B muốn trao đổi một thông điệp cho nhau nhưng lại không muốn người khác đọc vào hiểu ngay nên nghĩ ra một cách như sau: Xáo trộn trật tự của các từ trong một câu. Tất nhiên, để bạn của mình hiểu được thì cẩn phải có một quy tắc “giải mã” thông điệp đó. Quy tắc giải mã cũng khá đơn giản là:
Mỗi câu trong thông điệp có N từ sẽ được kèm với một dãy số gồm n số nguyên dương đôi một khác nhau và không lớn hơn n. Trong dãy số đó, nếu số thứ i có giá trị là j thì từ thứ j trong câu thông điệp trên sẽ chuyển thành từ thứ i trong câu thông điệp cần tìm.
Yêu cầu: Lập trinhg giải mã một thông điệp cho trước.
Input: File văn bản MES.INP gồm 2 dòng:
· Dòng đầu ghi một xâu kí tự có không quá 255 kí tự là thông điệp được gửi đi. Trong kí tự này không quá 50 từ, mỗi từ có không quá 30 kí tự.
· Dòng thứ 2 ghi một dãy các số nguyên dương đôi một khác nhau dùng để giải mã thông điệp trên.
Output: File văn bản MESS.OUT gồm một dòng ghi xâu kí tự là thông điệp đã được giải mã.
Ví dụ:
MESS.INP
MESS.OUT
Luon chuc hoc ban gioi luon
2 4 1 6 3 5
chuc ban luon luon hoc gioi

Bài 4: (20đ) Biểu thức đại số
Cho số nguyên (-100 K 100) và một dãy gồm N số nguyên a[1], a[2],…,a[n] với 1 < n 40 và 1 a 100.
Yêu cầu:
Hãy xác định xem có bao nhiêu cách điền vào giữa tất cả các số trong dãy đã cho các dấu cộng (+) hoặc trừ (-) để thu được một biểu thức có giá trị bằng K.
Ví dụ: Với K = 2 và dãy gồm 6 số: 1 2 1 2 6 2 thì ta có tất cả 2 cách điền:
1 + 2 + 1 + 2 - 6 + 2 = 2
1 - 2 + 1 - 2 + 6 - 2 = 2
Input: File văn bảnEXP.INP có 2 dòng:
· Dòng 1: Ghi 2 số nguyên n, K mỗi số cách nhau một dấu cách.
· Dòng 2: Ghi n số nguyên a[1], a[2],…,a[n] , mỗi số cách nhau một dấu cách.
Output: File văn bảnEXP.OUT ghi một số nguyên m là số cách điền dấu cộng hoặc trừ vào giữa tất cả các số trong dãy đã cho để được một biểu thức có giá trị bằng K.
Ví dụ:
EXP.INP
EXP.OUT
6 2
1 2 1 2 6 2
2
 
M

mikelhpdatke


Cho Robot đang ở vị trí trên tọa độ A(x,y)
Tìm điểm đến của một Robot trên A(x,y) theo một chuỗi cho trước, và định theo 1 quy luật sẵn:
Dm: cho robot đi lên theo m
dm: cho robot lùi theo m
Qm: cho robot quay một góc 45 m lần theo chiều kim đồng hồ
qm: cho robot quay một góc 45 m lần ngược chiều kim đồng hồ
Nhập vào một chuỗi theo quy luật, in ra tọa độ A(x,y) mà robot đến

Hơi khó hiểu, bạn hiểu cho VD đi. Hiểu được là cho được. Nhưng phải hiểu đúng ;))
 
C

cuong276

Ơ hơ hơ! Đà Nẵng mà nhầm Đà Lạt. Hic. Rồi OK. Làm luôn. Mình thấy khá khó, à quên khá dễ
 
M

mikelhpdatke

Cứ làm hết bài 3, 4 post code lên đây mình xem thuật toán bạn làm thế nào rồi mình chấm cho :))
 
C

cuong276

OK! Mình post code bài 1,2 trước cho. Dễ làm trước, khó làm sau. Hì hì. Bài 3,4 để sau.
 
C

cuong276

Bài 1: (20đ)
Nhập từ bàn phím một số nguyên dương N (3 ≤ N ≤ 1000000000). In ra màn hình số nguyên dương M lớn nhất sao cho M <và N chia hết cho M.
Ví dụ: Nhập: N = 12
In ra màn hình: M = 4

Bài 1 đề có nhầm lẫn không đó? Đáng lẽ M phải bằng 6 chứ, sao lại bằng 4 thế này?
 
C

cuong276

Code bài 1 nè:
Mã:
var n,i,m:longint;
begin
   write('n=');readln(n);
   for i:=1 to n-1 do if n mod i=0 then m:=i;
   write('m= ',m);
   readln;
end.
 
Last edited by a moderator:
C

cuong276

Code bài 2 nè:
Mã:
var s,st:string;
    i,j,d:integer;
begin
     write('nhap xau st: ');readln(st);
     d:=0;
     for i:=1 to 9 do
         begin
              str(i,s);
              for j:=1 to length(st) do if st[j]=s then inc(d);
         end;
     write(d);
     readln;
end.
 
M

mikelhpdatke

Dùng integer thì không ăn được. Làm xong 2 bài kia chưa. TỚ có thêm mấy bài nữa đang nghĩ đây
 
C

cuong276

Sắp xong bài 3 rồi. Còn bài 4 có lẽ phải để sáng mai. Cậu cứ post bài lên đi.
 
M

mikelhpdatke

Bài 4 hình như mình post code lên rồi đấy. CŨng chả nhớ :D.

2. có một máy đổi mẫu tự a, b, c kỳ lạ như sau: Khi bỏ vào máy đúng một mẫu tự a và đúng một mẫu tự b thì máy cho ra 2 mẫu tự c, khi bỏ vào máy 1 mẫu tự a, 1 mẫu tự c thì máy cho ra 2 mẫu tự b, khi bỏ vào máy 1 mẫu tự b, 1 mẫu tự c thì máy cho ra 2 mẫu tự a. Cho trước m mẫu tự a, n mẫu tự b, k mẫu tự c, hãy đổi ra nhiều mẫu tự c nhất.
Yêu cầu: Viết Ct nhập các số tự nhiên m, n, k là số mẫu tự a, b, c tương ứng. Hiện ra màn hình số mẫu tự c nhiều nhất có thể đổi được.
vd: nhập m=2, n=5, k=1
Số mẫu tự c nhiều nhất có thể đổi được là 8 theo cách sau:
- Lấy 1 mẫu tự b và 1 mẫu tự c bỏ vào máy cho ra 2 mẫu tự a ta có 4 mẫu tự a, 4 mẫu tự b và 0 mẫu tự c.
- Thực hiện 4 lần bỏ vào máy, mỗi lần 1 mẫu tự a, 1 mẫu tự b tự được 8 mẫu tự c.
 
C

cuong276

Code bài 3 nè. Sai sót ở đâu thì mọi người góp ý nha.
Mã:
var a,c:array[1..100] of string;
    b:array[1..100] of integer;
    st:string;
    f,g:text;
    i,cs,n,j:integer;
begin
     assign(f,'mess.inp');
     reset(f);
     while not eoln(f) do read(f,st);
     readln(f);
     n:=1;
     while not eoln(f) do
           begin
                read(f,b[n]);
                inc(n);
           end;
     dec(n);
     cs:=1;
     for i:=1 to n do
         begin
              a[i]:='';
              for j:=cs to length(st) do
                  begin
                       a[i]:=a[i]+st[j];
                       if st[j]=' ' then
                          begin
                               cs:=j+1;
                               break;
                          end;
                  end;
         end;
     close(f);
     assign(g,'mess.out');
     rewrite(g);
     for i:=1 to n do
         begin
              j:=b[i];
              c[i]:=a[j];
         end;
     for j:=1 to n do write(g,c[j],' ');
     close(g);
end.
 
Q

quanghero100

Bài 1:
Mã:
uses crt;
var n,i,m:longint;
begin
   clrscr;
   write('N='); readln(n);
   i:=1;
   repeat
      inc(i);
   until n mod i=0;
   writeln('M=',n div i,' ',i);
   readln;
end.
 
Q

quanghero100

Bài 3:
Mã:
uses crt;
var s:string;
    a:array[1..100] of integer;
    b:array[1..100] of string;
    i,n,k:integer;
    f1,f2:text;
procedure tach_tu(s:string);
var i,t:integer;
begin
  n:=0;
  s:=s+#32;
  while s[1]=#32 do delete(s,pos(#32,s),1);
  while pos(#32#32,s)<>0 do delete(s,pos(#32#32,s),1);
  n:=0;
  while pos(#32,s)<>0 do
    begin
       inc(n);
       t:=pos(#32,s);
       b[n]:=copy(s,1,t-1);
       delete(s,1,t);
    end;
end;

begin
   assign(f1,'MESS.inp');
   reset(f1);
   assign(f2,'MESS.out');
   rewrite(f2);
   readln(f1,s);
   tach_tu(s);
   for i:=1 to n do
      read(f1,a[i]);
   for i:=1 to n do write(f2,b[a[i]],' ');
   close(f1);
   close(f2);
end.
 
Last edited by a moderator:
Status
Không mở trả lời sau này.
Top Bottom