Hi, cứ tưởng không bạn nào tham gia hết cơ :P
Ý tớ là tham gia thảo luận về giải thuật, code từng bài, ai có ý tưởng hay thì trình bày cho mọi người.
Theo ý kiến của tớ:
- Đề thi này không khó, cũng có thể nói là "hơi dễ".
- Đề bài gồm 3 bài, mỗi bài một dạng:
+ Bài 1: Xử lý chuỗi
+ Bài 2: Sắp xếp
+ Bài 3: Hình học
* Phân tích cụ thể:
- Bài 1: Ta thấy số mà không là kết quả mã hóa của số nào khác (số M cần tìm) phải có số các chữ số là một số lẻ. Vậy ta chỉ cần thao tác ngược lại qui trình mã hóa đến khi nhận được số có số các chữ số là một số lẻ thì đó là KQ. Ta cần đưa về dạng chuỗi thao tác cho đơn giản.
VD (test trong đề) 21322113 -> 11222113 -> 122113 -> 2113 -> 113 là kết quả vì nó có 3 chữ số (3 là số lẻ).
- Bài 2 thực chất không phải bài về big number, việc phải làm là sắp xếp N số cho trước theo thứ tự tăng dần rồi kiếm tra xem nó có tạo thành dãy cấp số cộng không. Với N = 20,000 thì việc sắp xếp theo cách thông thường mất khá nhiều thời gian. Vì thế bài này nên chọn cách sắp xếp nhanh như Quick Sort. Hoặc nếu không làm theo quick sort thì nên kết hợp việc kiểm tra với việc sắp xếp để rút ngắn thời gian chạy.
- Bài 3 là bài dạng hình học cụ thể liên quan tới HCN. Bài này giải thuật có tớ như sau:
Bước 1:
- Vẽ HCN bất kỳ vào hệ trục tọa độ, S bao = S HCN này
Bước 2:
- Vẽ HCN bất kỳ khác vào.
Bước 3:
+ Nếu HCN này nằm ngoài các HCN nào đang có => S bao = S bao + S HCN này.
+ Nếu HCN này cắt 1 HCN khác có sẵn
- Tạo HCN bao 2 HCN này, S bao mới = S bao cũ - S của 1 HCN con cắt nhau.
- Quay lại B3 với HCN mới là HCN bao này
Bước 4:
- Nếu còn HCN thì quay lại B2
Bước 5:
- In KQ là S bao.
VD (test cho sẵn):
- Vẽ HCN 1: S = 8
- Vẽ HCN 2: S = 8 + 1 = 9
- Vẽ HCN 3: S = 9 - 8 = 1
Quay lại B3: S = 1 - 1 =0
Quay lại B3: S = 25
- Vẽ HCN 4: S = 25 + 6 = 31
- Vẽ HCN 5: S = 31 + 6 = 37
- Vẽ HCN 6: S = 37 - 6 = 31
Quay lại B3: S = 31 + 18 = 49
Với giải thuật này code rất ngắn, chỉ cần 2 vòng lặp lồng nhau, vòng lặp thứ nhất vẽ từng HCN vào trục tọa độ (Bước 2 -> Bước 4), vòng lặp 2 xử lý các HCN lồng nhau (Bước 3).