Thứ Sáu, 20 tháng 11, 2015

ĐỀ THI HSG CẤP TỈNH 2014-2015 VÀ ĐÁP ÁN NGÀY THỨ 1

SỞ GIÁO DỤC VÀ ĐÀO TẠO
KIÊN GIANG
-------------
KỲ THI CHỌN HỌC SINH GIỎI VÒNG TỈNH LỚP 12 THPT
NĂM HỌC 2014-2015
-----------------------
ĐỀ CHÍNH THỨC
(Đề thi gồm 02 trang)
MÔN: TIN HỌC
Thời gian làm bài: 180 phút (không kể thời gian giao đề)
Ngày thi thứ nhất: 25/9/2014

TỔNG QUAN BÀI THI
Bài
Tên bài
File chương trình
File dữ liệu vào
File kết quả
Điểm
1
Giải mã
GIAIMA.PAS
GIAIMA.INP
GIAIMA.OUT
6
2
Sắp xếp
SAPXEP.PAS
SAPXEP.INP
SAPXEP.OUT
7
3
Đường đi
DUONGDI.PAS
DUONGDI.INP
DUONGDI.OUT
7

Thí sinh lập trình giải các bài toán sau:
Bài 1: Giải mã.
Để hiển thị trên màn hình các số hệ thập phân, máy tính có một bộ phận làm nhiệm vụ biến đổi dữ liệu từ hệ nhị phân về hệ thập phân.
Yêu cầu: Cho một dãy nhị phân có độ dài 1 byte (8 bit). Hãy biến đổi 7 bit đầu tiên của dãy nhị phân đó thành số thập phân tương ứng, bit thứ 8 (tận cùng bên trái) dùng để biểu diễn dấu nếu là 1 thì biểu diễn dấu âm, ngược lại thì biểu diễn dấu dương.
Dữ liệu vào: Từ file văn bản GIAIMA.INP gồm: một hoặc nhiều dòng, mỗi dòng là một dãy nhị phân có độ dài 1 byte.
Dữ liệu ra: Đưa vào file văn bản GIAIMA.OUT gồm: một hoặc nhiều dòng, mỗi dòng là một số thập phân tương ứng.
Ví dụ:
GIAIMA.INP
GIAIMA.OUT
10000111
00011111
-7
31
Bài 2: Sắp xếp.
Cho một bảng số A gồm n hàng và m cột (nxm), các phần tử của bảng số A là số nguyên.
Yêu cầu: Sắp xếp các phần tử của bảng số A đã cho theo thứ tự tăng dần từ trái qua phải và từ trên xuống dưới.
Dữ liệu vào: Từ file văn bản SAPXEP.INP gồm:
- Dòng đầu là 2 số nguyên n và m.
- n dòng tiếp theo, mỗi dòng m số nguyên (bảng số A).
Dữ liệu ra: Đưa vào file văn bản SAPXEP.OUT gồm n dòng mỗi dòng có m số nguyên (bảng số A sau khi sắp xếp).
Ví dụ:
SAPXEP.INP
SAPXEP.OUT
5 8
1 3 9 8 3 2 4 5
5 2 4 1 6 1 7 9
4 3 3 4 1 2 3 2
5 3 8 1 6 3 5 4
8 2 1 2 1 1 3 4
1 1 1 1 1 1 1 1
2 2 2 2 2 2 3 3
3 3 3 3 3 3 4 4
4 4 4 4 5 5 5 5
6 6 7 8 8 8 9 9
Bài 3: Đường đi.
Tại một quốc gia có n thành phố, biết rằng đường đi giữa 2 thành phố bất kỳ (nếu có) đều là đường đi hai chiều. Sơ đồ mạng lưới giao thông của n thành phố được biểu diễn bởi bảng A gồm n dòng và n cột (nxn), trong đó:
A[i,j] là độ dài đường đi từ thành phố i đến thành phố j.
A[i,j]=0 nếu không có đường đi từ thành phố i đến thành phố j.
A[i,j]=A[j,i]
A[i,i]=0
A[i,j] là số nguyên, không âm.
Yêu cầu: Tìm đường đi ngắn nhất giữa hai thành phố p và q. Nếu không tồn tại đường đi thì thông báo ‘khong co duong di tu p den q’, nếu tồn tại hơn một đường đi ngắn nhất thì chọn đường đi qua ít thành phố trung gian nhất.
Dữ liệu vào: Từ file văn bản DUONGDI.INP gồm:
- Dòng đầu là số nguyên dương n.
- n dòng tiếp theo, mỗi dòng n số nguyên.
- Dòng cuối cùng gồm 2 số nguyên p và q
Dữ liệu ra: Đưa vào file văn bản DUONGDI.OUT: Đường đi ngắn nhất hoặc thông báo ‘khong co duong di tu p den q’.
Ví dụ:
DUONGDI.INP
DUONGDI.OUT
6
0 5 0 0 0 9
5 0 6 0 0 0
0 6 0 7 0 0
0 0 7 0 8 0
0 0 0 8 0 9
9 0 0 0 9 0
1 5
Duong di ngan nhat tu 1 den 5 dai 18 co lo trinh 1 -> 6 -> 5

---Hết---
Ghi chú:
·        Thí sinh không được sử dụng tài liệu.

·        Cán bộ coi thi không giải thích gì thêm.

ĐÁP ÁN: 
BÀI 1:
 program giai_ma;
     var f,g:text; ss:string;
     function lt(x,k:byte):byte;
      var t,i:byte;
      Begin
        t:=1; if k=0 then lt:=1;
        for i:=1 to k do
          t:=t*x;
        lt:=t;
      End;
    procedure xuly(s:string);
      var n,t,i:integer;
      Begin
        t:=0; n:=length(s);
        for i:=n downto 2 do if s[i]='0' then t:=t+0*lt(2,n-i)
                              else t:=t+1*lt(2,n-i);
        if  s[1]='1' then t:=-t;
        writeln(g,t);
      End;
  BEGIN
     assign(f,'giaima3.inp');  reset(f);
     assign(g,'giaima3.out'); rewrite(g);
     while not(eof(f)) do
       begin
          readln(f,ss); xuly(ss);

       end;
             close(f);close(g);
  END.
BÀI 2:
program sapxep;
  const max=30000;
  var c:array[1..max] of integer;
  m,n,i,j,k: integer; g:text;
  procedure  nhap;
    var f:text;
    begin
      assign(f,'sapxep.inp'); reset(f);
      readln(f,n,m);
      fillchar(c,sizeof(c),0);
      for i:=1 to n do
       begin
        for j:=1 to m do
         read(f,c[(i-1)*m+j]);
        readln(f);
       end;
       close(f);
       n:=n*m;
    end;
  procedure sort;
    begin
      for i:=1 to n do
        for j:=n downto i+1 do
          if c[j]<c[j-1] then
            begin
              k:=c[j];
              c[j]:=c[j-1];
              c[j-1]:=k;
            end;
    end;
  procedure xuat;
    begin
      n:=n div m;
      for i:=1 to n do
        begin
          for j:=1 to m do
            write(g,c[(i-1)*m+j], ' ');
            writeln(g);
        end;
    end;
  BEGIN
      assign(g,'sapxep.out'); rewrite(g);
      nhap;
      sort;
      xuat;
      close(g);
  END.
BÀI 3:
program duong_di;
    var a,c:array[1..50,1..50] of integer;
    n,p,q: integer;
    i,j,k: integer; g:text;
    procedure nhap;
      var f:text;
      begin
        assign(f,'duongdi3.inp');
        reset(f);
        readln(f,n);
        fillchar(a,sizeof(a),0);
        c:=a;
        for i:=1 to n do
          begin
            for j:=1 to n do
              read(f,a[i,j]);
            readln(f);
          end;
          readln(f,p,q);
          close(f);
      end;
   procedure xuat(i,j:integer);
     begin
       if c[i,j]=0 then write(g,'->',j)
       else begin
             xuat(i,c[i,j] );
             xuat(c[i,j],j);
            end;
     end;
  procedure xuly;
    begin
           for k:=1 to n do
             for i:=1 to n do
                if a[i,k]>0 then
                  for j:=1 to n do
                    if ( a[j,k]>0) and (i<>j) then
                     if (a[i,j]=0)or(a[i,j]>a[i,k]+a[k,j]) then
                      begin
                        a[i,j]:=a[i,k]+a[k,j];
                        c[i,j]:=k;
                      end;
        if a[p,q]=0 then writeln(g,'Khong co duong di tu ',p,' den ',q)
        else begin
              writeln(g,'Duong di ngan nhat tu ' ,p,' den ',q,' dai ',a[p,q]);
              write(g,p);
              xuat(p,q);
             end;
    end;
    BEGIN
      assign(g,'duongdi3.out'); rewrite(g);
      nhap;
      xuly;
      close(g);
    END.

Không có nhận xét nào:

Đăng nhận xét