Bài thi h/s giỏi lớp 10 năm 2012

H

hung1xpro96

[TẶNG BẠN] TRỌN BỘ Bí kíp học tốt 08 môn
Chắc suất Đại học top - Giữ chỗ ngay!!

ĐĂNG BÀI NGAY để cùng trao đổi với các thành viên siêu nhiệt tình & dễ thương trên diễn đàn.

Bài 1 : (5 điểm ) Số độ cao h
Độ cao của một số tự nhiên là tổng các chữ số của số đó . Cho số tự nhiên N ( n<10^9) , số tự nhiên h ( h<100) . Đếm số lượng tất cả các số bé hơn N sao cho số đó có độ cao bằng h .
- Dữ liệu vào : DOCAO.INP : - Gồm 1 dòng ghi số N và h.
- Dữ liệu ra : DOCAO.OUT : - Gồm 1 số là số lượng các số bé hơn N có độ cao bằng h .
vd:
DOCAO.INP
100 8
DOCAO.OUT
9
 
Last edited by a moderator:
R

rabbit.thuy

Hình như bộ test of bạn bị sai. Kết quả 9 mới đúng :)
Mã:
const fi='docao.inp'; fo='docao.out';
var n,h: longint;
   f1,f2: text;
procedure nhap;
begin
        assign(f1,fi); assign(f2,fo);
        reset(f1); rewrite(f2);
        read(f1,n,h);
end;
procedure xuat;
begin
        close(f1); close(f2);
end;
function kt(i: longint): boolean;
var  x,j,t,e: longint;
        s: string;
begin
        str(i,s); t:=0;
        for j:=1 to length(s) do
                begin
                     val(s[j],x,e);
                     t:=t+x;
                end;
        if t=h then kt:=true else kt:=false;
end;
procedure xuli;
var i,d: longint;
begin
        d:=0;
        for i:=1 to n-1 do
                if kt(i) then inc(d);
        write(f2,d);
end;
begin
        nhap;
        xuli;
        xuat;
end.
 
H

hoangha8394

Hình như bộ test of bạn bị sai. Kết quả 9 mới đúng :)
Mã:
const fi='docao.inp'; fo='docao.out';
var n,h: longint;
   f1,f2: text;
procedure nhap;
begin
        assign(f1,fi); assign(f2,fo);
        reset(f1); rewrite(f2);
        read(f1,n,h);
end;
procedure xuat;
begin
        close(f1); close(f2);
end;
function kt(i: longint): boolean;
var  x,j,t,e: longint;
        s: string;
begin
        str(i,s); t:=0;
        for j:=1 to length(s) do
                begin
                     val(s[j],x,e);
                     t:=t+x;
                end;
        if t=h then kt:=true else kt:=false;
end;
procedure xuli;
var i,d: longint;
begin
        d:=0;
        for i:=1 to n-1 do
                if kt(i) then inc(d);
        write(f2,d);
end;
begin
        nhap;
        xuli;
        xuat;
end.

Nếu làm như bạn sẽ bị time limit exceeded(TLE) vì vòng for 10^9 :)|
Bài này gọi đệ quy hàm find(h,p) trả về số lượng số có độ cao h và số đang xét có giá trị p.
Nếu h=0 và p<n then exit(1) .
nếu h=0 và p>=n then exit(0)
Nếu h<>0 và p>n then exit(0)
còn lại for từ x từ 0 đến 9
begin
res:=res+find(h-x,p*10+x);
end;
exit(res);
 
H

hung1xpro96

Mã:
Program Bai1;
 Const fi='docao.inp';
       fo='docao.out';
 Var d,i,j,n,m:Longint;
     f,g:Text;
Procedure doctep;
 Var i,j:Integer;
  Begin
   Assign(f,fi);
   Reset(f);
   Readln(f,n,m);
   Close(f);
  End;
Function tinh(x:Integer):Integer;
 Var s:Integer;
  Begin
   s:=0;
    While x > 0 do
     Begin
      s:=s+x mod 10;
      x:=x div 10;
     End;
   tinh:=s;
  End;
Begin
 doctep;
 d:=0;
 Assign(g,fo);
 Rewrite(g);
 For i:=1 to n-1 do
  If tinh(i)=m then
   inc(d);
 Writeln(g,d:3);
 Close(g);
End.
Làm cách này nhanh nhất !!! bài này là bài dễ nhất trong cái bài mình mới thi sáng nay còn mấy bài khác thì mai mốt mình đăng cho !!
 
Last edited by a moderator:
M

marik

Mã:
Program Bai1;
 Const fi='bai.inp';
       fo='bai.out';
 Var d,i,j,n,m:Longint;
     f,g:Text;
Procedure doctep;
 Var i,j:Integer;
  Begin
   Assign(f,fi);
   Reset(f);
   Readln(f,n,m);
   Close(f);
  End;
Function tinh(x:Integer):Integer;
 Var s:Integer;
  Begin
   s:=0;
    While x > 0 do
     Begin
      s:=s+x mod 10;
      x:=x div 10;
     End;
   tinh:=s;
  End;
Begin
 doctep;
 d:=0;
 Assign(g,fo);
 Rewrite(g);
 For i:=1 to n-1 do
  If tinh(i)=m then
   inc(d);
 Writeln(g,d:3);
 Close(g);
End.
Làm cách này nhanh nhất !!! bài này là bài dễ nhất trong cái bài mình mới thi sáng nay còn mấy bài khác thì mai mốt mình đăng cho !!

làm kiểu này em không thể qua được 3/10 test :|
 
H

hung1xpro96

em mới học lớp 10 chứ mấy :)) với lại mấy cái integer em vội đánh nên quên chưa sửa thành boolean :))
 
H

hoangha8394

Mã:
Program Bai1;
 Const fi='bai.inp';
       fo='bai.out';
 Var d,i,j,n,m:Longint;
     f,g:Text;
Procedure doctep;
 Var i,j:Integer;
  Begin
   Assign(f,fi);
   Reset(f);
   Readln(f,n,m);
   Close(f);
  End;
Function tinh(x:Integer):Integer;
 Var s:Integer;
  Begin
   s:=0;
    While x > 0 do
     Begin
      s:=s+x mod 10;
      x:=x div 10;
     End;
   tinh:=s;
  End;
Begin
 doctep;
 d:=0;
 Assign(g,fo);
 Rewrite(g);
 For i:=1 to n-1 do
  If tinh(i)=m then
   inc(d);
 Writeln(g,d:3);
 Close(g);
End.
Làm cách này nhanh nhất !!! bài này là bài dễ nhất trong cái bài mình mới thi sáng nay còn mấy bài khác thì mai mốt mình đăng cho !!

Cách này chạy quá lâu chắc chắn bởi vòng for to n-1 =.=.
 
P

p_trk

theo mình bài làm chỉ cần nhớ được hàm tỉnh tổng các chữ số là được đúng không bạn hungxpro !!
bài này đưa về dạng khó như sau : cũng đề như số bạn nhưng n là một số lớn ( phép toán số lơn ) . chắc các bạn hiểu chứ ?
các bạn thử code bài này rồi post lên cho các bạn cùng thao khảo nha ! nói thật mình cũng chưa làm được bài này !!
 
H

haiphongit.cntt

Còn đây là bài của mình. Đã test rất oke.
Bạn còn bài nào hay khác post lên luôn nhé. Hj
uses crt;
const inputfile = 'docao.inp';
outputfile = 'docao.out';
var n: byte;
docao: word;
st: string;
code: integer;

procedure enter;
var f: text;
begin
assign(f,inputfile);
reset(f);
read(f,st);
close(f);
end;

procedure xuli;
var i: integer;
begin
for i:=1 to length(st) do
begin
val(st,n,code);
docao:=docao+n;
end;
end;

procedure xuat;
var f: text;
begin
assign(f,outputfile);
rewrite(f);
writeln(f,docao);
close(f);
end;

begin
enter;
xuli;
xuat;
end.
 
H

hung1xpro96

Bài 2 : ( 6 điểm ) Lưới
Cho lưới ô vuông gồm N dòng M cột . Trong mỗi ô của lưới chỉ chứa số 0 hoặc 1 . Một ô vuông ở dòng x cột y kí hiệu là (x,y) . Từ 1 ô vuông có thể di chuyển sang 4 ô vuông chung cạnh . Một vùng là tập hợp các ô kề cạnh với nhau và có giá trị bằng nhau . Cho trước 2 ô (x1,y1) và (x2,y2) . Hãy cho biết hai ô đã cho có thuộc cùng một vùng hay không ?
Dữ liệu vào : LUOI.INP
- Dòng 1 L Ghi 2 số N , M . (1<=N , M<=100) .
- Dòng 2 : Ghi 4 số x1,y1,x2,y2 . (1<=x1,x2<=N ; 1<=y1,y2<=M)
Dữ liệu ra : LUOI.OUT
- Gồm 1 dòng : Ghi Yes nếu 2 ô (x1,y1) và (x2,y2) cùng thuộc 1 vùng .
Ghi No nếu 2 ô (x1,y1) và (x2,y2) không thuộc 1 vùng .
Vd: LUOI.INP

5 7
1 1 3 2
1 1 1 1 1 1 1
1 1 0 0 1 0 0
1 1 1 0 0 0 1
1 0 0 0 1 0 1
1 0 1 1 1 0 1

LUOI.OUT

Yes


bạn post các bài khác lên đi hùng ;
cảm ơn bạn nhiều !!
Mình tên Hưng nhé :))
 
Last edited by a moderator:
H

hung1xpro96

-----------------Giải Bài Lưới -------------------------
Mã:
Program Bai1;
 Const fi = 'luoi.inp';
       fo = 'luoi.out';
       Vx : Array [1..4] Of Integer = (-1,1,0,0);
       Vy : Array [1..4] Of Integer = (0,0,1,-1);
 Var    A : Array [1..100,1..100] Of Integer;
    kx,ky : Array [1..100] Of Integer;
d,i,j,n,m : Integer;
c,q,w,e,r : Integer;
      f,g : Text;
Procedure doctep;
 Var  i,j : Integer;
  Begin
   Assign(f,fi);
   Reset(f);
   Readln(f,n,m);
   Readln(f,q,w,e,r);
   For i:=1 to n do
    Begin
     For j:=1 to m do
      Read(f,a[i,j]);
      Readln(f);
    End;
   Close(f);
   c:=0; d:=1;
  End;
Procedure them(x,y : Integer);
 Begin
  inc(c);
  kx[c]:=x;
  ky[c]:=y;
 End;
Procedure rut(Var x,y : Integer);
 Begin
  x:=kx[d];
  y:=ky[d];
  inc(d);
 End;
Function ktra(x,y : Integer) : Boolean;
 Begin
  ktra:=false;
  If ( 1<=x ) and ( x<=n ) and ( 1<=y ) and ( y<=m ) then
  ktra:=true;
 End;
Procedure try(x,y : Integer);
 Var i,j,xo,yo : Integer;
  Begin
   them(x,y);
   a[x,y]:=2;
   While c >= d do
    Begin
     rut(x,y);
     For i:=1 to 4 do
      Begin
       xo:=x+Vx[i];
       yo:=y+Vy[i];
       If (a[xo,yo]=1) and (ktra(xo,yo)=true) then
        Begin
         them(xo,yo);
         A[xo,yo]:=2;
        End;
      End;
    End;
  End;
Procedure ghi;
 Var i,j : Integer;
  Begin
   Assign(g,fo);
   Rewrite(g);
   If (a[q,w] <> a[e,r]) then Writeln(g,'No')
   Else
    Begin
     try(q,w);
     If a[e,r]=2 then Writeln(g,'Yes')
     Else Writeln(g,'No');
    End;
   Close(g);
  End;
Begin
 doctep;
 ghi;
End.
 
Last edited by a moderator:
H

hoangha8394

Bài 2 : ( 6 điểm ) Lưới
Cho lưới ô vuông gồm N dòng M cột . Trong mỗi ô của lưới chỉ chứa số 0 hoặc 1 . Một ô vuông ở dòng x cột y kí hiệu là (x,y) . Từ 1 ô vuông có thể di chuyển sang 4 ô vuông chung cạnh . Một vùng là tập hợp các ô kề cạnh với nhau và có giá trị bằng nhau . Cho trước 2 ô (x1,y1) và (x2,y2) . Hãy cho biết hai ô đã cho có thuộc cùng một vùng hay không ?
Dữ liệu vào : LUOI.INP
- Dòng 1 L Ghi 2 số N , M . (1<=N , M<=100) .
- Dòng 2 : Ghi 4 số x1,y1,x2,y2 . (1<=x1,x2<=N ; 1<=y1,y2<=M)
Dữ liệu ra : LUOI.OUT
- Gồm 1 dòng : Ghi Yes nếu 2 ô (x1,y1) và (x2,y2) cùng thuộc 1 vùng .
Ghi No nếu 2 ô (x1,y1) và (x2,y2) không thuộc 1 vùng .
Vd: LUOI.INP

5 7
1 1 3 2
1 1 1 1 1 1 1
1 1 0 0 1 0 0
1 1 1 0 0 0 1
1 0 0 0 1 0 1
1 0 1 1 1 0 1

LUOI.OUT

Yes



Mình tên Hưng nhé :))

Bài này là duyệt chiều rộng(BFS) cơ bản :D.Tìm thành phần liên thông chứa điểm thứ nhất.Kiểm tra xem điểm còn lại có thuộc thành phần liên thông đó không :D

 
H

hung1xpro96

Bài 3 : ( 6 điểm ) Robot
Cho hình chữ nhật NxM ô vuông gồm N dòng M cột . Mỗi ô vuông ghi 1 số nguyên không vượt quá 100 thể hiện cho mức độ cản trở Robot khi Robot vào ô đó . Một Robot đứng tại ô góc trái trên (1,1) muốn di chuyển xuống góc phải dưới (n,m) của hình chữ nhậy . Mỗi bước Robot di chuyển sang ô bên phải hoặc ô phía dưới ô đang đứng .
Yêu cầu : Tìm đường đi ít cản trở Robot nhất và tính tổng các mức cản trở Robot trên con đường đó ( kể cả mức cản trở tại ô đầu tiên Robot đang đứng ) .
Dữ liệu vào : ROBOT.INP
- Dòng 1 : Ghi 2 số N , M ( 1<=N,M<=100)
- N Dòng tiếp theo , mỗi dòng ghi M số nguyên dương tương ứng với giá trị các ô vuông của hình chữ nhật .

Dữ liệu ra : ROBOT.OUT
- Gồm 1 dòng : Ghi tổng các mức cản trở Robot ít nhất để Robot đi từ ô (1,1) đến ô (n,m) của hình chữ nhật .
vd : Robot.inp

3 4
1 1 1 1
5 2 2 9
9 4 2 1

Robot.out
8
 
H

hung1xpro96

Bài giải của bài Robot mọi người xem thử đúng hay sai ?
Mã:
Program Bai1;
 Const fi='bai2.inp';
       fo='bai2.out';
       max= 100;
 Var i,j,n,m:Integer;
    a,l:Array[0..max+1,0..max+1] Of Integer;
    f,g:text;
Procedure doctep;
 Var i,j:Integer;
  Begin
   Assign(f,fi);
   Reset(f);
   Readln(f,n,m);
   For i:=1 to n do
    For j:=1 to m do
     Read(f,a[i,j]);
   Close(f);
  End;
Procedure khoitao;
 Var i,j:Integer;
  Begin
   For i:=0 to n+1 do
   For j:=0 to m+1 do
   l[i,j]:=maxint;
   l[0,1]:=0;
  End;
Function min(x,y:Integer):Integer;
 Begin
  If x > y then min:=y else min:=x;
 End;
Procedure xd;
 var i,j:Integer;
  Begin
  For i:=1 to n do
  For j:=1 to m do
   l[i,j]:=a[i,j]+min(l[i-1,j],l[i,j-1]);
  End;
Begin
 doctep;
 khoitao;
 xd; 
 Assign(g,fo);
 Rewrite(g);
 Writeln(g,l[n,m]:3);
 Close(g);
End.
 
R

rabbit.thuy



Nếu làm như bạn sẽ bị time limit exceeded(TLE) vì vòng for 10^9 :)|
Bài này gọi đệ quy hàm find(h,p) trả về số lượng số có độ cao h và số đang xét có giá trị p.
Nếu h=0 và p<n then exit(1) .
nếu h=0 và p>=n then exit(0)
Nếu h<>0 và p>n then exit(0)
còn lại for từ x từ 0 đến 9
begin
res:=res+find(h-x,p*10+x);
end;
exit(res);
Mình đã làm thử cách này nhưng bị lỗi:
202 Stack overflow error The stack has grown beyond its maximum size (in which case the size of local variables should be reduced to avoid this error), or the stack has become corrupt. This error is only reported when stack checking is enabled.

 
H

hoangha8394

Mình đã làm thử cách này nhưng bị lỗi:
202 Stack overflow error The stack has grown beyond its maximum size (in which case the size of local variables should be reduced to avoid this error), or the stack has become corrupt. This error is only reported when stack checking is enabled.


Cái này là lỗi tràn stack ấy mà .
Bạn chỉ việc khai báo tăng stack lên là được
Khai báo trên đầu chương trình :
{$M 64000000,0,64000000}
->tăng stack lên 64MB.
Còn nếu như thế vẫn không được thì bài của bạn bị stack lồng vô hạn -> sai rồi :D
 
H

hung1xpro96

Bài 4 : ( 3 điểm ) Cân
Một cái cân hai đĩa và N quả cân có khối lượng A[1],A[2],....,A[n] . Hãy tìm cách đặt các quả cân trên hai đĩa sao cho cân thăng bằng .
Dữ liệu vào : CAN.INP
- Dòng 1 : Ghi 1 số N (2<=N<=100) .
- Dòng 2 Ghi N số A[1],A[2],...,A[n](1<=a<=100) .
Dữ liệu ra : CAN.OUT
Gồm 2 dòng mỗi dòng ghi khối lượng của các quả cân trên mỗi đĩa cân .
Nếu bài toán không có lời giải thì ghi số 0 .

Mã:
:
vd : CAN.INP                            CAN.OUT
          
          3                                    5
          3 5 2                                3 2
          
          CAN.INP                              CAN.OUT

          3                                    0  
          4 2 8
 
Top Bottom