Độ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 sẽ giải trước bài hội trường, mấy bài kia mai post sau
Mã:
Program HoiTruong;
Var A,B,C,F:array[0..100000] Of Integer;
    D:array[0..100000] Of Boolean;
    N,i,j,k:integer;

Procedure Init;
 Begin
   Readln(n);
   For i:=1 to n do
    Begin
     Readln(A[i], B[i]);
     C[i]:=B[i]-A[i];
    End;
    FillChar(D,SizeOf(D),True);
 //Writeln;
End;

Procedure Sapxep(L,H:integer);
Var i,j,k,t:integer;
 Begin
  If L>=H then exit;
  k:=B[Random(H-L+1)+L];
  i:=L;
  j:=H;
   Repeat
    While B[i]<k do inc(i);
    While B[j]>k do dec(j);
    If i<=j then
      Begin
         t:=C[i];
         C[i]:=C[j];
         C[j]:=t;
         t:=A[i];
         A[i]:=A[j];
         A[j]:=t;
         t:=B[i];
         B[i]:=B[j];
         B[j]:=t;
         inc(i);
         dec(j);
    End;
  Until i>j;
 Sapxep(L,j);Sapxep(i,H);
End;

Function kt(i,j:integer):boolean;
Var p,l:integer;
 Begin
  kt:=False;
   For p:=A[i]+1 to B[i]-1 do
      D[p]:=False;
      writeln;
   If not(D[A[j]]) or not(D[B[j]]) then begin FillChar(D,SizeOf(D),True); exit; end;
  kt:=True;
  FillChar(D,SizeOf(D),True);
 End;

Procedure Install;
 Var i,j,max,kq:integer;
  Begin
   F[1]:=C[1];
   max:=-1;
   For k:=2 to n do
     Begin
       f[k]:= 0;
       For j:=k-1 downto 1 do
          If b[j] <= a[k] then
            begin
                 f[k]:= f[j] + c[k];
                 break;
            end;
       max:=-1;
       If F[k]=0 then F[k]:=C[k];
       If F[k-1]>=F[k] then F[k]:=F[k-1];
    End;


   writeln(F[n]);
  End;
 BEGIN
  Init;
  Sapxep(1,N);
  Install;

 readln
END.
 
M

mikelhpdatke

Mình nghĩ ra cái thuật toán của bài 1 hình như sai thì phải. Mọi người thử xem nha. Cho tất cả các số có chỉ số chẵn của a vào 1 mảng sau đó cũng làm tương tự với b. So sánh 2 mảng đó nếu số nào bằng nhau thì tăng biến đếm. Sau đó xét với các số chỉ số lẻ của b rồi của a. Mình nhìn qua hình như sai thì phải.

Bài 1 cách tốt nhất nên dùng QHĐ
GỌi 2 mảng là A và B. F[i,j] là độ dài dãy con ko kề dài nhất trong cả 2 mảng từ 1->i ở mảng A và từ 1->j ở mảng B.
Khi đó
Nếu A<>B[j] thì F[i,j]:=F[i-2,j-2]+1;
Nếu A=B[j] thì F[i,j]:=Max(F[i-1,j],F[i,j-1]).
Bạn nên học QHĐ đi :D
 
Q

quanghero100


Bài 1

Mã:
uses crt;
var n:integer;
      kt:boolean;;
begin
   clrscr;
   write('n='); readln(n);
   kt:=true;
   while n>0 do
       begin
             if n mod 2 =0 then kt:=false;
             n:=n div 10;
       end;
   if kt=true writeln('YES') else writeln('NO');
   readln;
end.
 
Q

quanghero100

Chữ số tận cùng khác 0
Mã bài: TCDFZ

Cho số tự nhiên n (n <= 10^9). Hãy tìm chữ số tận cùng khác 0 của n!
Input

- Dòng duy nhất ghi số N.
Output

- Gồm 1 dòng duy nhất ghi kết quả tìm được.
Example

Input:
5

Output:
2
Mã:
uses crt;
var n,i,d:longint;
function t(n,i:longint):longint;
var j:longint;
begin
  t:=n;
  for j:=1 to i do
     t:=t div 5;
end;
begin
      clrscr;
   read(n);
   i:=1; d:=0;
   repeat
     d:=d+t(n,i);
     inc(i);
   until t(n,i)<1;
   write(d);
end.
chết đọc nhầm đề rùi :( :( tưởng đếm số chữ số 0 chứ :(( :((
 
Last edited by a moderator:
M

mikelhpdatke

Page trước e post rồi mà

Dãy con chung không liền kề dài nhất

Dãy C = c1, c2, ..., ck là dãy con không liền kề của dãy A = a1, a2, ..., am nếu C có thể nhận được bằng cách chọn một dãy các phần tử không liền kề của A, nghĩa là tìm dược dãy các chỉ số i1, i2, ..., ik sao cho:

1 ≤ i1, i2, ..., ik ≤ m;
i1 < i2 - 1, i2 < i3 - 1, ..., ik - 1 < ik - 1;
c1 = ai1, c2 = ai2, ck = aik.

Ta gọi độ dài của dãy số là số phần tử của nó.

Cho hai dãy:
A = a1, a2, ..., am

B = b1, b2, ..., bn

Dãy C được gọi là dãy con chung không liền kề của hai dãy A và B nếu như nó vừa là dãy con không liền kề của A, vừa là dãy con không liền kề của B.
Yêu cầu

Cho hai dãy số A và B. Hãy tìm độ dài của dãy con chung không liền kề dài nhất của hai dãy đã cho.
Dữ liệu

Dòng đầu tiên chứa hai số nguyên dương m và n (2 ≤ m, n ≤ 103) được ghi cách nhau bởi dấu cách, lần lượt là số lượng phần tử của dãy A và dãy B.
Dòng thứ i trong m dòng tiếp theo chứa số nguyên không âm ai (ai ≤ 104), i = 1, 2, ..., m.
Dòng thứ j trong n dòng tiếp theo chứa số nguyên không âm bj (bj ≤ 104), j = 1, 2, ..., n.

Kết quả

Ghi ra trên một dòng duy nhất độ dài của dãy con chung không liền kề dài nhất của hai dãy A và B.
Ví dụ

Input:
4 5
4
9
2
4
1
9
7
3
4

Output:
2
 
C

cuong276

Bài 2:
Mã:
var n,j:integer;
    st,i:char;
    i1:string;
    f,g:text;
procedure doctep;
var f,g:text;
    n:longint;
begin
     assign(f,'exp.inp');
     reset(f);
     read(f,n);
     assign(g,'exp.out');
     rewrite(g);
end;
function cong(a,b:string):string;
var n,s,i,i1,i2,d,code:integer;
    s1,st:string;
begin
     while length(a)<>length(b) do
           begin
                if length(a)>length(b) then b:='0'+b;
                if length(a)<length(b) then a:='0'+a;
           end;
     d:=0;
     s1:='';
     for i:=length(a) to 1 do
         begin
              val(a[i],i1,code);
              val(b[i],i2,code);
              n:=i1+i2+d;
              s:=n mod 10;
              d:=n div 10;
              str(s,st);
              s1:=st+s1;
         end;
     if d=1 then
        begin
             str(d,st);
             s1:=st+s1;
        end;
     cong:=s1;
end;
procedure nhan(a,b:longint);
var i,j,d,k,n,h,m:longint;
    code:integer;
    s:array[1..100]of string;
    st,s2,p,o:string;
begin
     str(a,p);
     str(b,o);
     for j:=length(o) downto 1 do
         begin
         d:=0;
         s[j]:='';
         val(o[j],n,code);
         for i:=length(p) downto 1 do
             begin
                  val(p[i],m,code);
                  k:=((m*n) mod 10)+d;
                  d:=(m*n) div 10;
                  str(d,st);
                  s[j]:=st+s[j];
             end;
         for h:=1 to (length(o)-1) do s[j]:=s[j]+'0';
         end;
     s2:=cong(s[1],s[2]);
     for j:=3 to length(o) do s2:=cong(s2,s[j]);
end;
procedure dongtep;
begin
     close(f);
     close(g);
end;
[COLOR="Red"]begin
     doctep;
     for i:=2 to n do i1:=nhan(i1,i);
     for j:=length(i1) downto 1 do
         if i1[j]<>'0' then
            begin
                 write(g,i1[j]);
                 break;
            end;
     dongtep;
end.[/COLOR]
Nản. Đến đây là tịt rồi. Cái chỗ đo đỏ ý. Mọi người có thể giúp mình sửa lại đoạn đó được không? Chương trình đang làm dở nên không nỡ bỏ.
 
M

mikelhpdatke

Mã:
uses crt;
var n,i,d:longint;
function t(n,i:longint):longint;
var j:longint;
begin
  t:=n;
  for j:=1 to i do
     t:=t div 5;
end;
begin
      clrscr;
   read(n);
   i:=1; d:=0;
   repeat
     d:=d+t(n,i);
     inc(i);
   until t(n,i)<1;
   write(d);
end.
chết đọc nhầm đề rùi :( :( tưởng đếm số chữ số 0 chứ :(( :((


Ý tưởng đếm chữ số 0 của a là gì thế,,,,,,,,,,,,,?????????
 
C

cuong276

Cho dù đếm số 0 thì chương trình cũng hổng chạy được anh ơi. Nó báo lỗi gì gì đó
 
C

cuong276

Thêm readln cũng thế thôi. Ở đây chương trình báo lỗi error 88. Tức là hình như thiếu dấu ngoặc đơn thì phải
 
C

cuong276

Bài 2:
Mã:
var n,j:integer;
    st,i:char;
    i1:string;
    f,g:text;
procedure doctep;
var f,g:text;
    n:longint;
begin
     assign(f,'exp.inp');
     reset(f);
     read(f,n);
     assign(g,'exp.out');
     rewrite(g);
end;
function cong(a,b:string):string;
var n,s,i,i1,i2,d,code:integer;
    s1,st:string;
begin
     while length(a)<>length(b) do
           begin
                if length(a)>length(b) then b:='0'+b;
                if length(a)<length(b) then a:='0'+a;
           end;
     d:=0;
     s1:='';
     for i:=length(a) to 1 do
         begin
              val(a[i],i1,code);
              val(b[i],i2,code);
              n:=i1+i2+d;
              s:=n mod 10;
              d:=n div 10;
              str(s,st);
              s1:=st+s1;
         end;
     if d=1 then
        begin
             str(d,st);
             s1:=st+s1;
        end;
     cong:=s1;
end;
procedure nhan(a,b:longint);
var i,j,d,k,n,h,m:longint;
    code:integer;
    s:array[1..100]of string;
    st,s2,p,o:string;
begin
     str(a,p);
     str(b,o);
     for j:=length(o) downto 1 do
         begin
         d:=0;
         s[j]:='';
         val(o[j],n,code);
         for i:=length(p) downto 1 do
             begin
                  val(p[i],m,code);
                  k:=((m*n) mod 10)+d;
                  d:=(m*n) div 10;
                  str(d,st);
                  s[j]:=st+s[j];
             end;
         for h:=1 to (length(o)-1) do s[j]:=s[j]+'0';
         end;
     s2:=cong(s[1],s[2]);
     for j:=3 to length(o) do s2:=cong(s2,s[j]);
end;
procedure dongtep;
begin
     close(f);
     close(g);
end;
[COLOR="Red"]begin
     doctep;
     for i:=2 to n do i1:=nhan(i1,i);
     for j:=length(i1) downto 1 do
         if i1[j]<>'0' then
            begin
                 write(g,i1[j]);
                 break;
            end;
     dongtep;
end.[/COLOR]
Nản. Đến đây là tịt rồi. Cái chỗ đo đỏ ý. Mọi người có thể giúp mình sửa lại đoạn đó được không? Chương trình đang làm dở nên không nỡ bỏ.
Ngồi chơi à? Làm tiếp dùng tớ đi. Đến chỗ đo đỏ là tớ mù đầu rồi nghĩ loạn hết cả đầu rồi. Không nghĩ cái gì ra cái gì nữa cả.
P/s: Đạt mai thi chọn phải không? Chúc thi tốt nha
 
M

mikelhpdatke

Mấy bác làm đề nào thế

Đề thi loại hôm nay mình làm điêu quạ Cả 2 thằng thi loại với nhau đều làm hết
21.gif


Bài 1:
Bài 37/2000 - Số siêu nguyên tố
(Dành cho học sinh THCS)
Số siêu nguyên tố là số nguyên tố mà khi bỏ một số tuỳ ý các chữ số bên phải của nó thì phần còn lại vẫn tạo thành một số nguyên tố.
Ví dụ 7331 là một số siêu nguyên tố có 4 chữ số vì 733, 73, 7 cũng là các số nguyên tố.
Nhiệm vụ của bạn là viết chương trình nhập dữ liệu vào là một số nguyên N (0< N <10) và đưa ra kết quả là một số siêu nguyên tố có N chữ số cùng số lượng của chúng.
Ví dụ khi chạy chương trình:
Nhap so N: 4
Cac so sieu nguyen to có 4 chu so la: 2333 2339 2393 2399 2939 3119 3137 3733 3739 3793 3797 5939 7193 7331 7333 7393
Tat ca co 16 so_

--------------------------------------------

Dãy các số tự nhiên được viết ra thành một dãy vô hạn trên đường thẳng:
1234567891011121314..... (1)
Hỏi số ở vị trí thứ N trong dãy trên là số nạo Với N lấy từ File với N<=10^9.


----------------------------

Bài 3: Là bài mã hóa xậu. Chắc các bạn cũng biết rộif
 
C

cuong276

Bài 1:
Mã:
uses crt;
var d,n,i,csd,csc:longint;
function ktsnt(a:longint):boolean;
var kt:boolean;
    d,i:integer;
begin
     kt:=true;
     while a<>0 do
           begin
                d:=0;
                if a<2 then
                   begin
                        kt:=false;
                        break;
                   end;
                for i:=2 to a-1 do
                    if a mod i=0 then inc(d);
                if d<>0 then
                   begin
                        kt:=false;
                        break;
                   end;
                a:=a div 10;
           end;
     ktsnt:=kt;
end;
begin
     clrscr;
     write('n=');readln(n);
     csd:=1;
     csc:=10;
     i:=1;
     while i<n do
           begin
                csd:=csd*10;
                csc:=csc*10;
                inc(i);
           end;
     dec(csc);
     write('cac so sieu nguyen to co ',n,' chu so la: ');
     d:=0;
     for i:=csd to csc do
         if ktsnt(i)=true then
            begin
                 write(i,' ');
                 inc(d);
            end;
     writeln;
     write('co tat ca ',d,' so');
     readln;
end.
 
C

cuong276

Bài 2:
Mã:
var s1,c:string;
    n,k:longint;
function cong(a,b:string):string;
var n,s,i,i1,i2,d,code:integer;
    s1,st:string;
begin
     while length(a)<>length(b) do
           begin
                if length(a)>length(b) then b:='0'+b;
                if length(a)<length(b) then a:='0'+a;
           end;
     d:=0;
     s1:='';
     for i:=length(a) downto 1 do
         begin
              val(a[i],i1,code);
              val(b[i],i2,code);
              n:=i1+i2+d;
              s:=n mod 10;
              d:=n div 10;
              str(s,st);
              s1:=st+s1;
         end;
     if d=1 then
        begin
             str(d,st);
             s1:=st+s1;
        end;
     cong:=s1;
end;
begin
     write('n='); readln(n);
     k:=1;
     s1:='1';
     c:='1';
     while k<n do
           begin
                s1:=cong(s1,c);
                k:=k+length(s1);
           end;
     write(s1[n-k+length(s1)]);
     readln;
end.
Còn bài 3 thì mã hoá có nhiều dạng bài lắm. Bạn cho đề cụ thể đi
 
M

mikelhpdatke

Bài 3:
Bài toán sau mô tả một thuật toán mã hoá đơn giản (để tiện ta lấy ví dụ tiếng Anh, các bạn có thể mở rộng cho tiếng Việt):
Tập hợp các chữ cái tiếng Anh bao gồm 26 chữ cái được đánh sô thứ tự từ 0 đến 25 như sau:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
a b c d e f g h I j k l m n O p q r s t u v w x y Z

Quy tắc mã hoá một ký tự như sau (lấy ví dụ ký tự X):
- Tìm số thứ tự tương ứng của ký tự ta được 23
- Tăng giá trị số này lên 5 ta được 28
- Tìm số dư trong phép chia số này cho 26 ta được 2
- Tra ngược bảng chữ cái ta thu được C.
a. Sử dụng quy tắc trên để mã hoá các dòng chữ sau:
PEACE
HEAL THE WORLD
I LOVE SPRING
b. Hãy tìm ra quy tắc giải mã các dòng chữ sau:
N FR F XYZIJSY
NSKTVRFYNHX
MFSTN SFYNTSFQ ZSNBJVXNYD
 
Q

quanghero100

Cho dù đếm số 0 thì chương trình cũng hổng chạy được anh ơi. Nó báo lỗi gì gì đó

ui trời zậy mà cũng hẽm bik hả chỉ cần thay read(n) ==> readln(n);
cuối chương trình thêm readln; nữa là chạy ổn mà :p :p :p
Tại bài đó anh làm trong làm bài trực tuyến nên khi làm không có readln(n); và readln; ở cuối chương trình như khi chạy trên máy
 
Status
Không mở trả lời sau này.
Top Bottom