about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRaphael McSinyx <vn.mcsinyx@gmail.com>2016-11-19 19:00:47 +0700
committerRaphael McSinyx <vn.mcsinyx@gmail.com>2016-11-19 20:46:04 +0700
commitf97ad3e9e225a288e7a8a53c2ef0acb45a47dbde (patch)
tree4d2d7ff6fd480396ed862069e7edc26fa7b66ccd
parent10de10a507238f3be43dee304e057679b5bb2736 (diff)
downloadcp-f97ad3e9e225a288e7a8a53c2ef0acb45a47dbde.tar.gz
Thêm đề 12 Thanh Hoá 2008-2009
-rw-r--r--12/TP-ThanhHoá-2009/BAI4.PAS29
-rw-r--r--12/TP-ThanhHoá-2009/README.md173
-rw-r--r--12/TP-ThanhHoá-2009/bai1.pas39
-rw-r--r--12/TP-ThanhHoá-2009/bai2.pas41
-rw-r--r--12/TP-ThanhHoá-2009/bai4.pas72
-rwxr-xr-x12/TP-ThanhHoá-2009/bai4.py28
-rwxr-xr-x12/TP-ThanhHoá-2009/bai4pas_srcgen.py19
-rw-r--r--12/TP-ThanhHoá-2009/bai5.pas112
-rw-r--r--12/TP-ThanhHoá-2009/sortnfind.pas83
9 files changed, 596 insertions, 0 deletions
diff --git a/12/TP-ThanhHoá-2009/BAI4.PAS b/12/TP-ThanhHoá-2009/BAI4.PAS
new file mode 100644
index 0000000..8706032
--- /dev/null
+++ b/12/TP-ThanhHoá-2009/BAI4.PAS
@@ -0,0 +1,29 @@
+const
+  m: array[1..9] of byte = (0, 0, 1, 1, 0, 0, 4, 7, 0);
+  equa: array[1..9] of ansistring = (
+    #10,
+    #10,
+    #10'1+2-3=0'#10,
+    #10'1-2-3+4=0'#10,
+    #10,
+    #10,
+    #10'1+2-3+4-5-6+7=0'#10'1+2-3-4+5+6-7=0'#10'1-2+3+4-5+6-7=0'#10'1-2-3-4-5+6+7=0'#10,
+    #10'1+2+3+4-5-6-7+8=0'#10'1+2+3-4+5-6+7-8=0'#10'1+2-3+4+5+6-7-8=0'#10'1+2-3-4-5-6+7+8=0'#10'1-2+3-4-5+6-7+8=0'#10'1-2-3+4+5-6-7+8=0'#10'1-2-3+4-5+6+7-8=0'#10,
+    #10
+  );
+
+var
+  n: byte;
+  f: text;
+
+begin
+  assign(f, 'BAI4.INP');
+  reset(f);
+  read(f, n);
+  close(f);
+
+  assign(f, 'BAI4.OUT');
+  rewrite(f);
+  write(f, m[n], equa[n]);
+  close(f)
+end.
diff --git a/12/TP-ThanhHoá-2009/README.md b/12/TP-ThanhHoá-2009/README.md
new file mode 100644
index 0000000..b64db6b
--- /dev/null
+++ b/12/TP-ThanhHoá-2009/README.md
@@ -0,0 +1,173 @@
+# Kì thi học sinh giỏi tỉnh Thanh Hoá lớp 12 năm học 2008 - 2009
+
+Sở Giáo dục và Đào tạo Thanh Hoá
+
+Môn thi: Tin học
+
+Ngày thi: 28/03/2009
+
+Thời gian: 180 phút
+
+## Tổng quan bài thi
+
+|  Bài  | Tệp chương trình | Tệp dữ liệu vào | Tệp kết quả ra |  Điểm |
+| :---: | :--------------: | :-------------: | :------------: | :---: |
+|   1   |     BAI1.PAS     |     BAI1.INP    |    BAI1.OUT    |   5   |
+|   2   |     BAI2.PAS     |     BAI2.INP    |    BAI2.OUT    |   5   |
+|   3   |     BAI3.PAS     |     BAI3.INP    |    BAI3.OUT    |   4   |
+|   4   |     BAI4.PAS     |     BAI4.INP    |    BAI4.OUT    |   3   |
+|   4   |     BAI5.PAS     |     BAI5.INP    |    BAI5.OUT    |   3   |
+
+Giới hạn thời gian cho mỗi test là 3 giây.
+
+Dữ liệu vào là đúng đắn, không cần phải kiểm tra.
+
+## Bài 1: Số nguyên tố
+
+Cho dãy số gồm có N số nguyên dương a<sub>1</sub>, a<sub>2</sub>, …,
+a<sub>N</sub> và một số nguyên dương K.
+
+### Yêu cầu
+
+Hãy cho biết số lượng các phần tử có giá trị nhỏ hơn K là số nguyên tố của dãy
+số trên.
+
+### Dữ liệu
+
+* Dòng đầu tiên là hai số N và K.
+* Dòng tiếp theo lần lượt là N số nguyên của dãy số.
+
+### Kết quả
+
+Số M là số lượng các phần tử của dãy số thoả mãn yêu cầu đề bài.
+
+### Giới hạn
+
+* 0 < N < 50000
+* 0 < K, a<sub>i</sub> < 5000 với mọi i = 1, 2, …, N
+
+### Ví dụ
+
+|        BAI1.INP       | BAI1.OUT |
+| --------------------- | :------: |
+| 7 8<br>1 2 3 8 7 6 11 |     3    |
+
+## Bài 2: Trung bình cộng
+
+Cho dãy gồm n số nguyên a<sub>1</sub>, a<sub>2</sub>, …, a<sub>n</sub> và số
+nguyên K. 
+
+### Yêu cầu
+
+Cho biết trong dãy số đã cho có tồn tại hay không một cặp số mà trung bình cộng
+của chúng là K.
+
+### Dữ liệu
+
+* Dòng đầu tiên ghi hai số n, K.
+* Dòng tiếp theo lần lượt ghi n số a<sub>1</sub>, a<sub>2</sub>, …,
+  a<sub>n</sub>. Các số trên cùng một dòng được ghi cách nhau ít nhất một dấu
+  cách trống. 
+
+### Kết quả
+
+* Số 1 nếu tồn tại một cặp số thoả mãn yêu cầu bài toán.
+* Số 0 nếu không tồn tại cặp số nào thoả mãn yêu cầu bài toán.
+
+### Giới hạn
+
+* 0 < N < 50000
+* |K|, |ai| < 1000 với mọi i = 1, 2, …, n
+
+### Ví dụ
+
+|    BAI2.INP    | BAI2.OUT |
+| -------------- | :------: |
+| 4 5<br>0 2 6 4 |     1    |
+| 3 3<br>1 2 3   |     0    |
+
+## Bài 3: Xâu đối xứng
+
+Xâu đối xứng là xâu đọc giống nhau nếu ta bắt đầu đọc từ trái qua phải hoặc từ
+phải qua trái. Ví dụ, xâu `RADAR` là xâu đối xứng, xâu `TOMATO` không phải là
+xâu đối xứng.
+
+### Yêu cầu
+
+Cho một xâu S gồm không quá 200 kí tự. Cho biết S có phải là xâu đối xứng hay
+không? Nếu không, cho biết số kí tự ít nhất cần thêm vào S để S trở thành xâu
+đối xứng.
+
+### Dữ liệu
+
+Gồm duy nhất 1 dòng ghi xâu S.
+
+### Kết quả
+
+Số k là số kí tự ít nhất cần thêm vào S để S trở thành xâu đối xứng. Nếu xâu S
+đã cho là đối xứng thì ghi k = 0.
+
+### Ví dụ
+
+| BAI3.INP | BAI3.OUT |
+| :------: | :------: |
+|   RADAR  |     0    |
+|  TOMATO  |     3    |
+
+## Bài 4: Biểu thức Zero
+
+Cuội viết liên tiếp các số tự nhiên từ 1 đến N thành dãy: 1 2 3 … N. Cuội đố
+Bờm điền các dấu phép toán + hoặc - vào giữa 2 số tự nhiên liên tiếp sao cho
+biểu thức thu được có kết quả bằng 0.
+
+### Yêu cầu
+
+Bạn hãy giúp Bờm viết chương trình liệt kê tất cả các cách điền dấu phép toán
+thích hợp.
+
+### Dữ liệu
+
+Gồm 1 dòng duy nhất ghi số N (N < 10).
+
+### Kết quả
+
+* Dòng đầu tiên ghi số M là số cách điền dấu vào biểu thức.
+* M dòng tiếp theo, mỗi dòng ghi một kết quả tìm được.
+
+### Ví dụ
+
+| BAI4.INP |   BAI4.OUT   |
+| :------: | ------------ |
+|     2    | 0            |
+|     3    | 1<br>1+2-3=0 |
+
+## Bài 5: Miền 0
+
+Cho một hình chữ nhật gồm M hàng, N cột, được chia thành MxN ô vuông. Mỗi ô
+vuông được ghi một trong hai số nguyên 0 hoặc 1. 
+
+Miền 0 là một miền liên tục các số 0 thuộc các ô chung cạnh với nhau. Diện tích
+miền là số lượng các ô vuông cùng giá trị thuộc miền đó.
+
+### Yêu cầu
+
+Tính diện tích miền 0 lớn nhất của hình chữ nhật đã cho.
+
+### Dữ liệu
+
+* Dòng đầu tiên ghi hai số M, N.
+* M dòng tiếp theo, mỗi dòng ghi N số lần lượt là giá trị các ô trong bảng số.
+
+### Kết quả
+
+Số nguyên duy nhất là diện tích miền 0 lớn nhất.
+
+### Giới hạn
+
+1 < M, N < 100.
+
+### Ví dụ
+
+|               BAI5.INP               | BAI5.OUT |
+| ------------------------------------ | :------: |
+| 3 4<br>0 0 0 1<br>1 1 0 1<br>0 0 1 0 |     4    |
diff --git a/12/TP-ThanhHoá-2009/bai1.pas b/12/TP-ThanhHoá-2009/bai1.pas
new file mode 100644
index 0000000..511d074
--- /dev/null
+++ b/12/TP-ThanhHoá-2009/bai1.pas
@@ -0,0 +1,39 @@
+var
+  prime: array[1..4999] of boolean;
+  n, i, k, a, j: word;
+  f: text;
+
+begin
+  fillchar(prime, sizeof(prime), true);
+  prime[1] := false;
+
+  for i := 2 to 70 do
+    if prime[i] then
+      for j := 2 to 4999 div i do
+        prime[i * j] := false;
+
+  for i := 1 to 4999 do
+    if prime[i] then
+      writeln(i);
+
+  assign(f, 'BAI1.INP');
+  reset(f);
+
+  readln(f, n, k);
+
+  j := 0;
+  for i := 1 to n do
+    begin
+      read(f, a);
+      if (a < k) and
+         prime[a] then
+        inc(j)
+    end;
+
+  close(f);
+
+  assign(f, 'BAI1.OUT');
+  rewrite(f);
+  writeln(f, j);
+  close(f)
+end.
diff --git a/12/TP-ThanhHoá-2009/bai2.pas b/12/TP-ThanhHoá-2009/bai2.pas
new file mode 100644
index 0000000..5b43c06
--- /dev/null
+++ b/12/TP-ThanhHoá-2009/bai2.pas
@@ -0,0 +1,41 @@
+var
+  n: word;
+  k, a: smallint;
+  f: text;
+  b: array[-999..999] of byte;
+
+
+function libai2(): byte;
+  var
+    i: smallint;
+
+  begin
+    for i := -999 to k - 1 do
+      if (b[i] > 0) and
+         (b[k * 2 - i] > 0) then
+        exit(1);
+
+    if b[k] > 1 then
+      exit(1);
+
+    exit(0)
+  end;
+
+
+begin
+  assign(f, 'BAI2.INP');
+  reset(f);
+  readln(f, n, k);
+  fillchar(b, sizeof(b), 0);
+  repeat
+    read(f, a);
+    inc(b[a]);
+    dec(n)
+  until n = 0;
+  close(f);
+
+  assign(f, 'BAI2.OUT');
+  rewrite(f);
+  writeln(f, libai2());
+  close(f)
+end.
diff --git a/12/TP-ThanhHoá-2009/bai4.pas b/12/TP-ThanhHoá-2009/bai4.pas
new file mode 100644
index 0000000..04839af
--- /dev/null
+++ b/12/TP-ThanhHoá-2009/bai4.pas
@@ -0,0 +1,72 @@
+var
+  f: text;
+  n, i: shortint;
+  a: array of string;
+
+
+function minus(num, bit: shortint): boolean;
+  begin
+    minus := num shr bit mod 2 = 1
+  end;
+
+
+function cal(n, b: shortint): boolean;
+  var
+    i, s: shortint;
+
+  begin
+    s := 0;
+
+    for i := 2 to n do
+      if minus(b, n - i) then
+        s := s - i
+      else
+        s := s + i;
+
+    cal := s = -1
+  end;
+
+
+function equa(n, b: shortint): string;
+  var
+    i: shortint;
+
+  begin
+    equa := '1';
+
+    for i := 2 to n do
+      begin
+        if minus(b, n - i) then
+          equa := equa + '-'
+        else
+          equa := equa + '+';
+
+        equa := equa + char(i + 48)
+      end;
+
+    equa := equa + '=0'
+  end;
+
+
+begin
+  assign(f, 'BAI4.INP');
+  reset(f);
+  readln(f, n);
+  close(f);
+  setlength(a, 0);
+
+  if n mod 4 mod 3 = 0 then
+    for i := 1 to 1 shl (n - 1) - 1 do
+      if cal(n, i) then
+        begin
+          setlength(a, length(a) + 1);
+          a[length(a) - 1] := equa(n, i)
+        end;
+
+  assign(f, 'BAI4.OUT');
+  rewrite(f);
+  writeln(f, length(a));
+  for i := 0 to length(a) - 1 do
+    writeln(f, a[i]);
+  close(f)
+end.
diff --git a/12/TP-ThanhHoá-2009/bai4.py b/12/TP-ThanhHoá-2009/bai4.py
new file mode 100755
index 0000000..f5c5a26
--- /dev/null
+++ b/12/TP-ThanhHoá-2009/bai4.py
@@ -0,0 +1,28 @@
+#!/usr/bin/env python3
+
+
+def ops(number, length):
+    b = bin(number)[2:]
+    return '+' * (length - len(b)) + b.replace('0', '+').replace('1', '-')
+
+
+def libai4(n):
+    seq, l = list(range(1, n + 1)), []
+
+    for i in range(2 ** (n - 1)):
+        s = ''.join(["{}{}".format(*j) for j in zip(ops(i, n), seq)])[1:]
+        if eval(s) == 0:
+            l.append(s + '=0\n')
+
+    return l
+
+
+if __name__ == '__main__':
+    with open('BAI4.INP') as f:
+        n = int(f.read())
+
+    with open('BAI4.OUT', 'w') as f:
+        l = libai4(n)
+        f.write('{}\n'.format(len(l)))
+        for s in l:
+            f.write(s)
diff --git a/12/TP-ThanhHoá-2009/bai4pas_srcgen.py b/12/TP-ThanhHoá-2009/bai4pas_srcgen.py
new file mode 100755
index 0000000..e345caa
--- /dev/null
+++ b/12/TP-ThanhHoá-2009/bai4pas_srcgen.py
@@ -0,0 +1,19 @@
+#!/usr/bin/env python3
+
+from bai4 import libai4
+
+
+with open("BAI4.PAS", "w") as f:
+    f.write("const\n  m: array[1..9] of byte = (")
+    l = [libai4(i) for i in range(1, 10)]
+    f.write(", ".join([str(len(i)) for i in l]))
+    f.write(");\n  equa: array[1..9] of ansistring = (\n");
+    l0 = []
+    for i in l:
+        s = "    #10" + "".join(["'" + j.replace("\n", "'#10") for j in i])
+        l0.append(s)
+    f.write(",\n".join(l0))
+    f.write("\n  );\n\nvar\n  n: byte;\n  f: text;\n\nbegin\n")
+    f.write("  assign(f, 'BAI4.INP');\n  reset(f);\n  read(f, n);\n")
+    f.write("  close(f);\n\n  assign(f, 'BAI4.OUT');\n  rewrite(f);\n")
+    f.write("  write(f, m[n], equa[n]);\n  close(f)\nend.\n")
diff --git a/12/TP-ThanhHoá-2009/bai5.pas b/12/TP-ThanhHoá-2009/bai5.pas
new file mode 100644
index 0000000..867b9d2
--- /dev/null
+++ b/12/TP-ThanhHoá-2009/bai5.pas
@@ -0,0 +1,112 @@
+uses
+  sortnfind;
+
+var
+  f: text;
+  rect: array of boolean;
+  mem: array of intar;
+  m, n: byte;
+  tmp, i, idx0, idx1: smallint;
+
+
+function locate(x: smallint): smallint;
+  var
+    i: smallint;
+
+  begin
+    for i := 0 to length(mem) - 1 do
+      if binin(mem[i], x) then
+        exit(i)
+  end;
+
+
+procedure mv(
+  src: intar;
+  var dest: intar
+);
+
+  var
+    lendest, lensrc, i: smallint;
+
+  begin
+    lendest := length(dest);
+    lensrc := length(src);
+    setlength(dest, lendest + lensrc);
+
+    for i := 0 to lensrc - 1 do
+      dest[i + lendest] := src[i];
+
+    setlength(src, 0);
+    qsort(dest)
+  end;
+
+
+begin
+  assign(f, 'BAI5.INP');
+  reset(f);
+  readln(f, m, n);
+  setlength(rect, m * n);
+
+  for i := 0 to m * n - 1 do
+    begin
+      read(f, tmp);
+
+      if tmp = 0 then
+        rect[i] := true
+      else
+        rect[i] := false
+    end;
+  close(f);
+
+  setlength(mem, 0);
+
+  for i := 0 to m * n - 1 do
+    if rect[i] then
+      begin
+        idx0 := -1;
+        idx1 := -1;
+
+        if (i > 0) and rect[i - 1] then
+          idx0 := locate(i - 1);
+
+        if (i >= n) and rect[i - n] then
+          if idx0 = -1 then
+            idx0 := locate(i - n)
+          else
+            begin
+              tmp := locate(i - n);
+
+              if tmp < idx0 then
+                begin
+                  idx1 := idx0;
+                  idx0 := tmp
+                end
+              else if tmp > idx0 then
+                idx1 := tmp
+            end;
+
+        if idx0 + idx1 = -2 then
+          begin
+            setlength(mem, length(mem) + 1);
+            setlength(mem[length(mem) - 1], 1);
+            mem[length(mem) - 1][0] := i;
+            continue
+          end;
+
+        setlength(mem[idx0], length(mem[idx0]) + 1);
+        mem[idx0][length(mem[idx0]) - 1] := i;
+
+        if idx1 > 0 then
+          mv(mem[idx1], mem[idx0])
+      end;
+
+  tmp := 0;
+  for i := 0 to length(mem) - 1 do
+    if length(mem[i]) > tmp then
+      tmp := length(mem[i]);
+
+  assign(f, 'BAI5.OUT');
+  rewrite(f);
+  writeln(f, tmp);
+  close(f)
+end.
diff --git a/12/TP-ThanhHoá-2009/sortnfind.pas b/12/TP-ThanhHoá-2009/sortnfind.pas
new file mode 100644
index 0000000..52e8d6b
--- /dev/null
+++ b/12/TP-ThanhHoá-2009/sortnfind.pas
@@ -0,0 +1,83 @@
+unit sortnfind;
+
+interface
+
+  type
+    intar = array of smallint;
+
+  procedure qsort(var a : intar);
+
+  function binin(
+    a: intar;
+    x: smallint
+  ): boolean;
+
+implementation
+
+  procedure qsort(var a : intar);
+
+    procedure sort(l, r: longint);
+      var
+        i, j, x, y: longint;
+
+      begin
+        i := l;
+        j := r;
+        x := a[(l + r) div 2];
+
+        repeat
+          while a[i] < x do
+            inc(i);
+
+          while x < a[j] do
+            dec(j);
+
+          if i <= j then
+            begin
+              y := a[i];
+              a[i] := a[j];
+              a[j] := y;
+              inc(i);
+              j := j - 1
+            end
+        until i > j;
+
+        if l < j then
+          sort(l, j);
+
+        if i < r then
+          sort(i, r)
+      end;
+
+    begin
+       sort(0, length(a) - 1)
+    end;
+
+
+  function binin(
+    a: intar;
+    x: smallint
+  ): boolean;
+
+    var
+      l, h, mid: word;
+
+    begin
+      l := 0;
+      h := length(a) - 1;
+
+      while l <= h do
+        begin
+          mid := (l + h) div 2;
+          if x = a[mid] then
+            exit(true)
+          else if x < a[mid] then
+            h := mid - 1
+          else
+            l := mid + 1
+        end;
+
+      binin := false
+    end;
+
+end.