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

ĐỀ THI HSG CẤP TỈNH 2015-2016 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 2015-2016

ĐỀ 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: 11/9/2015

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
Min- Max
MINMAX.PAS
MINMAX.INP
MINMAX.OUT
6
2
Số La Mã
LAMA.PAS
LAMA.INP
LAMA.OUT
7
3
Diện tích
DIENTICH.PAS
DIENTICH.INP
DIENTICH.OUT
7

Hãy lập trình giải các bài toán sau:
Bài 1: Min- Max. (6 điểm)
Cho một bảng số A có kích thước nxn (n ≤ 100).
Mỗi ô của bảng số chứa một số nguyên dương m bất kỳ.
Yêu cầu: Tìm số có giá trị nhỏ nhất và số có giá trị lớn nhất trong bảng số đã cho.
Dữ liệu vào: Từ file văn bản MINMAX.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 (bảng số A).
(các số trên một dòng cách nhau ít nhất một khoảng trắng)
Dữ liệu ra: Đưa vào file văn bản MINMAX.OUT gồm:
- Dòng đầu là số có giá trị nhỏ nhất.
- Dòng thứ 2 là số có giá trị lớn nhất.
Ví dụ:
MINMAX.INP
MINMAX.OUT
3
2 4 5
3 2 7
4 7 8
2
8
Bài 2: Số La Mã. (7 điểm)
Số La Mã hay chữ số La Mã là hệ thống chữ số cổ đại, dựa theo chữ số Etruria. Hệ thống chữ số La Mã dùng trong thời cổ đại đã được người ta chỉnh sửa vào thời Trung Cổ để biến nó thành dạng mà chúng ta sử dụng ngày nay. Hệ thống này dựa trên một số ký tự nhất định được coi là chữ số sau khi được gán giá trị, có 7 chữ số La Mã cơ bản: I=1, V=5, X=10, L=50, C=100, D=500, M=1000. Quy tắc viết số La Mã:
+ Các chữ số I, X, C, M không được lặp lại quá ba lần liên tiếp; các chữ số V, L, D không được lặp lại quá một lần liên tiếp.
+ I chỉ có thể đứng trước V hoặc X; X chỉ có thể đứng trước L hoặc C; C chỉ có thể đứng trước D hoặc M.
Cho một số B dưới dạng La Mã (giá trị thập phân của B<4000).
Yêu cầu: Đổi số La Mã về giá trị thập phân.
Dữ liệu vào: Từ file văn bản LAMA.INP chứa 1 số La Mã B.
Dữ liệu ra: Đưa vào file văn bản LAMA.OUT chứa giá trị thập phân của số La Mã B.
Ví dụ:
LAMA.INP
LAMA.OUT
MDCLXVI
1666
Bài 3: Diện tích. (7 điểm)
Trong mặt phẳng tọa độ trực chuẩn, cho n hình chữ nhật có các cạnh song song với trục tọa độ. Mỗi hình chữ nhật được xác định bởi tọa độ đỉnh dưới bên trái và đỉnh trên bên phải của nó.
Yêu cầu: Hãy tính diện tích phần mặt phẳng bị phủ bởi các hình chữ nhật trên.
Dữ liệu vào: Từ file văn bản DIENTICH.INP gồm:
- Dòng đầu là số nguyên dương n.
- n dòng tiếp theo, mỗi dòng ghi 4 số nguyên x1, y1, x2, y2 lần lượt là tọa độ đỉnh dưới bên trái và đỉnh trên bên phải của hình chữ nhật thứ i.
(các số trên một dòng cách nhau ít nhất một khoảng trắng)
Dữ liệu ra: Đưa vào file văn bản DIENTICH.OUT chứa một số nguyên là diện tích phần mặt phẳng bị phủ bởi các hình chữ nhật trên.
Ví dụ:
DIENTICH.INP
DIENTICH.OUT
5
0 0 10 10
3 0 8 7
-7 3 12 4
2 5 4 6
-1 0 0 8
116
Hình minh họa diện tích bị phủ của ví dụ trên:
---Hết---
Ghi chú:
·        Thí sinh không được sử dụng tài liệu.

·        Giám thị không giải thích gì thêm.

ĐÁP ÁN:
BÀI 1:
 program min_max;
   const fi='minmax3.inp';
         fo='minmax3.out';
   var n,m,i,j:byte;
       a:array[1..100,1..100]of byte;
   procedure nhap;
     var f:text;
     begin
         assign(f,fi);reset(f);
         readln(f,n);
         for i:=1 to n do
          begin
          for j:=1 to n do read(f,a[i,j]);
          readln(f);
          end;
        close(f);
     end;
   procedure xuly;
     var min,max:byte; f:text;
     begin
        min:=a[1,1];max:=min;
        assign(f,fo); rewrite(f);
        for i:=1 to n do
          for j:=1 to n do
           begin
            if max<a[i,j] then max:=a[i,j];
            if min>a[i,j] then min:=a[i,j];
           end;
           writeln(f,min);
           writeln(f,max);
        close(f);
     end;
     begin
       nhap;
       xuly;
       end.
BÀI 2:
program tinh_so_la_ma;
   const fi='lama3.inp';
         fo='lama3.out';
   var r:string;
   procedure nhap;
     var f:text;
     begin
       assign(f,fi); reset(f);
       readln(f,r);
       close(f);
     end;
   function  lama(r:string; i:integer):integer;
     var x:integer;
     function giatri(c:char):integer;
      begin
       case c of
         'M','m': giatri:=1000;
         'D','d': giatri:=500;
         'C','c': giatri:=100 ;
         'L','l': giatri:=50;
         'X','x': giatri:= 10;
         'V','v': giatri:=5;
         'I','i': giatri:= 1;
         else
           giatri:=0;
        end;
        end;
      begin
        x:=giatri(r[i]);
        if i=length(r) then lama:=x
         else
           if x<giatri(r[i+1]) then
            lama:=-x+lama(r,i+1)
            else lama:=x+lama(r,i+1);
        end;
     procedure xuat;
       var g:text;n:integer;
       begin
          assign(g,fo);
          rewrite(g);
          n:=lama(r,1);
          writeln(g,n);
          close(g);
       end;

    begin
       nhap;
       xuat;
    end.
BÀI 3:
 program tinh_dien_tich;
   const fi='dientic3.inp';
         fo='dientic3.out';
         maxn=100;
   type  hcn=record x1,x2,y1,y2:integer; end;
         mang=array[1..2*maxn] of integer;
   var   n,i,j,k:integer;
         a:array[1..maxn] of hcn;
         x,y:mang; s:longint;
    procedure nhap;
      var f:text;
       begin
          assign(f,fi); reset(f);
          readln(f,n);
          for i:=1 to n do
           readln(f,a[i].x1,a[i].y1,a[i].x2,a[i].y2);
           close(f);
       end;
   procedure sort(var b:mang);
      var i,j,k:integer;
      begin
         for i:=2 to 2*n-1 do
           for j:=2*n downto i do
             if b[j]<b[j-1] then
               begin
                 k:=b[j];
                 b[j]:=b[j-1];
                 b[j-1]:=k;
               end;
          end;
   function  kiemtra(i1,j1:integer):boolean;
       begin
          kiemtra:=true;
          for k:=1 to n do
            if (a[k].x1<=x[i1-1])and(x[i1]<=a[k].x2) and
               (a[k].y1<=y[j1-1])and(y[j1]<=a[k].y2) then exit;
               kiemtra:=false;
        end;
  procedure xuly;
     var f:text;
      begin
        s:=0;
        for i:=1 to n do
          begin
            x[i*2-1]:=a[i].x1;
            x[i*2]:=a[i].x2;
            y[i*2-1]:=a[i].y1;
            y[i*2]:=a[i].y2;
          end;
        sort(x);
        sort(y);
        for i:=2 to 2*n do
         for j:=2 to 2*n do
          if kiemtra(i,j) then
            s:=s+(x[i]-x[i-1])*(y[j]-y[j-1] );
          assign(f,fo); rewrite(f);
          writeln(f,s);
          close(f);
       end;
       begin
        nhap; xuly;
       end.



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

Đăng nhận xét