Category: LẬP TRÌNH

  • HƯỚNG DẪN SỬ DỤNG PHẦN MỀM AVINA

    HƯỚNG DẪN SỬ DỤNG PHẦN MỀM AVINA

    AVINA là một trong những PHẦN MỀM TẠO BÀI GIẢNG E-LEARNING giúp các thầy cô tạo ra bài giảng điện tử đạt chuẩn SCORM. Đây là một phần mềm thương mại của công ty Việt Nam, giá phần mềm khoảng 10 triệu đồng.

    Chúng tôi xin gửi tới thầy cô HƯỚNG DẪN SỬ DỤNG PHẦN MỀM AVINA. Thầy cô có thể xem trực tiếp trên website hoặc tải file PDF để xem trên máy tính, điện thoại.

    1. Giới thiệu phần mềm AVINA

    1.1. Tổng quan phần mềm AVINA

    AVINA là phần mềm Elearning (Authoring tool) do công ty TNHH Trí Việt Quốc Tế phát triển mới hoàn toàn từ năm 2018. Phiên bản AVINA là bản có sự cải tiến vượt bậc cả về công nghệ lẫn tính năng giúp phần mềm không chỉ đạt chuẩn quốc tế mà còn nổi trội hơn hẳn các công cụ tạo bài giảng Elearning khác về số lượng tính năng, độ mềm dẻo, linh hoạt trong thao tác sử dụng.

    Ưu điểm phần mềm AVINA

    • Phần mềm cung cấp đầy đủ và nhiều nhất các tính năng, công cụ phục vụ việc biên soạn, trình diễn, xuất bản các bài giảng, khóa học theo chuẩn quốc tế về E-Learning. Các tính năng gồm nhóm các công cụ multimedia (quay video, làm hiệu ứng, ghi âm, chụp ảnh, hiệu chỉnh các tư liệu media…); Các công cụ soạn thảo văn bản, tạo trang tài liệu. Các công cụ trình diễn; Các công cụ đóng gói hoàn thiện và xuất bản khóa học, đặc biệt các công cụ chuyên biệt cho hoạt động câu hỏi tương tác, trigger (tương tác người dùng).
    • Phần mềm vừa tương đồng lại tương thích với các phần mềm office phổ biến hiện nay như Microsoft Office, Open Office.

    1.2. Khởi động AVINA

    Tùy theo phiên bản Windows mà bạn đang sử dụng mà đường dẫn đến chương trình AVINA sẽ khác nhau đôi chút. Nhưng hầu hết các bước khởi động như sau:

    • Cách 1. Từ cửa sổ Windows bạn chọn Start. Chọn All Programs và tìm phần mềm AVINA.
    • Cách 2. Nhấp đúp chuột trái lên biểu tượng AVINA ở màn hình desktop.
    HƯỚNG DẪN SỬ DỤNG PHẦN MỀM AVINA
    Giao diện chính của chương trình AVINA

    1.3. Thoát AVINA

    Thoát chương trình AVINA rất đơn giản, bạn làm theo các cách sau:

    • Cách 1: Nhấn vào nút Đóng (X) ở góc trên cùng bên phải cửa sổ AVINA.
    • Cách 2: Dùng tổ hợp phím tắt <Alt+F4>

    Khi có sự thay đổi trong nội dung tài liệu mà bạn chưa lưu lại thì phần mềm sẽ hiện hộp thoại nhắc nhở bạn.

    • Chọn [YES]: sẽ lưu lại các thay đổi trước khi thoát
    • Chọn [NO]: sẽ thoát chương trình AVINA mà không lưu lại các thay đổi
    • Chọn [CANCEL]: để hủy lệnh thoát AVINA
    Hộp thoại nhắc nhở lưu các thay đổi trong tài liệu
    Hộp thoại nhắc nhở lưu các thay đổi trong tài liệu

    1.4. Các thành phần trên cửa sổ chương trình AVINA

    Cửa sổ chính của AVINA bao gồm các thành phần chính sau:

    HƯỚNG DẪN SỬ DỤNG PHẦN MỀM AVINA 1
    • Thanh tiêu đề: chứa thông tin về phần mềm AVINA
    • Thanh chức năng: chứa tất cả các chức năng được chia theo từng nhóm với nhiều tùy chọn khác nhau.
    • Vùng điều hướng: thể hiện cấu trúc của tài liệu, cho phép người dùng tùy chỉnh và di chuyển giữa các phần trong tài liệu.
    • Trang soạn thảo: thể hiện trang tài liệu đang được người dùng thao tác trực tiếp.

    Các nhóm chức năng

    Trang đầu: chứa các chức năng nổi bật trong quá trình soạn thảo tài liệu

    HƯỚNG DẪN SỬ DỤNG PHẦN MỀM AVINA 2

    Chèn: Thực hiện các lệnh chèn, thêm tất cả các đối tượng mà chương trình AVINA hỗ trợ: Đa phương tiện, Hình vẽ, Nhập từ PowerPoint, Khung văn bản, Hình ảnh, Biểu đồ

    HƯỚNG DẪN SỬ DỤNG PHẦN MỀM AVINA 3

    Thiết kế:  Chủ để, bố cục, màu sắc

    HƯỚNG DẪN SỬ DỤNG PHẦN MỀM AVINA 4

    Hiệu ứng: Thiết lập thời gian và kiểu hiệu ứng chuyển động cho đối tượng trên trang tài liệu

    HƯỚNG DẪN SỬ DỤNG PHẦN MỀM AVINA 5

    Chuyển trang: Thiết lập thời gian và kiểu hiệu ứng chuyển động cho trang tài liệu:

    HƯỚNG DẪN SỬ DỤNG PHẦN MỀM AVINA 6

    Xem: Thiết lập trên Xem, hiển thị, Thu/Phóng, xuất bản

    HƯỚNG DẪN SỬ DỤNG PHẦN MỀM AVINA 7

    Câu hỏi: Hỗ trợ người dùng soạn thảo câu hỏi tương tác

    HƯỚNG DẪN SỬ DỤNG PHẦN MỀM AVINA 8

    Định dạng: Tùy theo đối tượng hiện tại đang được chọn mà các chức năng trong nhóm định dạng sẽ khác nhau.

    Ví dụ: Định dạng của đối tượng [Hình vẽ]:

    HƯỚNG DẪN SỬ DỤNG PHẦN MỀM AVINA 9

    2. Tạo bài elearning cơ bản

    2.1. Tạo bài Elearning

    Mặc định khi mới khởi động chương trình AVINA đã tạo sẵn một tài liệu trống:

    HƯỚNG DẪN SỬ DỤNG PHẦN MỀM AVINA 10

    Người dùng tiến hành soạn thảo nội dung trên tài liệu trống này là tiến hành lưu lại để được một tài liệu mới.

    2.2. Chọn [Mẫu]

    • Sau khi phần mềm mở lên, click [Tệp]
    HƯỚNG DẪN SỬ DỤNG PHẦN MỀM AVINA 11
    • Tại [Tệp] => Chọn [Mới] => chọn [Mẫu] người dùng mong muốn => chọn [Tạo]
    HƯỚNG DẪN SỬ DỤNG PHẦN MỀM AVINA 12

    2.3. Lưu bài Elearning

    • Tại [Tệp] => Chọn [Lưu với]:
    HƯỚNG DẪN SỬ DỤNG PHẦN MỀM AVINA 13
    • Chọn [Máy tính] => chọn [Thư mục] để lưu.
    • Chọn [Duyệt] => Đến vị trí [Thư mục] muốn lưu
    • Nhấn tổ hợp phím [Ctrl + S]
    • Chọn icon [Lưu]

    2.4. Lưu đè lên [Tệp] đã lưu trước đó (Lưu)

    • Tại [Tệp] => Chọn [Lưu] (Điều kiện: đã lưu trước đó)
    • Nhấn tổ hợp phím [Ctrl + S]
    • Chọn icon [Lưu]

    2.5. Mở [Tệp] đã lưu

    • Tại [File] => Chọn [Mở]
    • Chọn [Các tài liệu gần đây]
    • Chọn [CLS]
    • Chọn [Máy tính] => Hiển thị [Các thư mục gần đây]
    • Chọn [Thư mục] muốn mở
    • Chọn [Duyệt] => Đến vị trí [Thư mục] muốn mở
    • Hoặc nhấn tổ hợp phím [Ctrl + O] => Đến [Thư mục] => chọn [Tệp] muốn mở

    2.6. Xuất tệp

    HƯỚNG DẪN SỬ DỤNG PHẦN MỀM AVINA 14
    • Tại [Tệp] => Chọn [Xuất bản]
    • Xuất bản ra PowerPoint
    • Xuất ra Word
    • Xuất ra PDF

    2.7. Tùy chọn

    • Tại [Tệp] => Chọn [Tùy chỉnh]
    • Chức năng tại [Lưu tài liệu]
    • [Lưu thông tin tự động sau mỗi phút]: Chọn vào checkbox này đồng thời thiết lập thời gian để phục hồi công việc của bạn nếu bạn gặp sự cố cúp điện hoặc ứng dụng tắt bất ngờ
    • [Đường dẫn lưu tập tin tự động]: Chọn địa chỉ lưu [Tệp] tự động
    • [Đường dẫn lưu tập tin tự động]: Chọn địa chỉ lưu [Tệp] mặc định
    • Tùy chỉnh ngôn ngữ => chọn combobox [Thay đổi lựa chọn ngôn ngữ], người dùng có thể chọn ngôn ngữ cho phiên bản sử dụng bằng Tiếng anh or Tiếng Việt
    • Để đáp ứng tốt hơn cho việc nhận biết các vấn đề, nguyên nhân xảy ra lỗi, người hỗ trợ cần bật Chức năng [Cài đặt ghi log] => chọn [Mở] => chọn [Mức độ] gồm: Lỗi nghiêm trọng, cảnh báo, Lỗi, thông báo, thông tin, tất cả. Tự động cập nhập thì chọn vào [Kiểm tra phiên bản mới khi mở chương trình]

    3. Hướng dẫn sử dụng các chức năng của hệ thống

    Mời các bạn xem chi tiết trong file PDF: Huong_dan_AVINA

  • 150 bài Toán Tin

    150 bài Toán Tin

    150 bài Toán Tin

    Chúng tôi xin giới thiệu 150 bài Toán Tin của thầy Lê Minh Hoàng (ĐHSP Hà Nội) để bạn đọc tham khảo.

    01. TÍNH TOÁN SONG SONG

    Biểu thức đủ là một dãy ký tự gồm các biến ký hiệu bằng chữ cái thường tiếng Anh: a..z, các phép toán cộng ký hiệu +, nhân ký hiệu * và các dấu ngoặc (,). Được định nghĩa như sau:

    1. Mỗi biến a,b,…,z là một biểu thức đủ
    2. Nếu X và Y là biểu thức đủ thì (X+Y) và (X*Y) cũng là biểu thức đủ.
    3. Những biểu thức nào không xây dựng được theo 2 nguyên tắc trên không là biểu thức đủ.

    VD: Theo cách định nghĩa trên thì (a+(b+(c+d))) hoặc ((a+b)+(c*d)) là các biểu thức đủ.

    Cho biết thời gian tính phép + là P, thời gian tính phép * là Q, người ta định nghĩa thời gian tính toán một biểu thức đủ như sau:

    • Nếu biểu thức đủ chỉ gồm 1 biến (a..z) thì thời gian tính toán là 0
    • Nếu X và Y là 2 biểu thức đủ; thời gian tính X là TX thời gian tính Y là TY thì thời gian tính

    (X+Y) là max(TX,TY)+P thời gian tính (X*Y) là max(TX,TY)+Q

    Từ 1 biểu thức đủ người ta có thể biến đổi về một biểu thức tương đương bằng các luật:

    • Giao hoán: (X+Y) (Y+X); (X*Y) ⇔ (Y*X)
    • Kết hợp: (X+(Y+Z)) ((X+Y)+Z); (X*(Y*Z)) ⇔ ((X*Y)*Z)

    Yêu cầu: Cho trước một biểu thức đủ E dưới dạng xâu ký tự hãy viết chương trình:

    1. Tìm thời gian tính toán biểu thức E
    2. Hãy biến đổi biểu thức E thành biểu thức E’ tương đương với nó sao cho thời gian tính E’ là ít nhất có thể.

    Dữ liệu vào được đặt trong file văn bản PO.INP như sau:

    • Dòng thứ nhất ghi 2 số P, Q cách nhau 1 dấu cách (P,Q≤100)
    • Tiếp theo là một số dòng, mỗi dòng ghi 1 biểu thức đủ. Kết quả ra đặt trong file văn bản PO.OUT như sau:

    Với mỗi biểu thức E trong file PO.INP ghi ra file PO.OUT 3 dòng

    • Dòng thứ nhất: Ghi thời gian tính toán E
    • Dòng thứ hai: Ghi biểu thức E’
    • Dòng thứ ba: Ghi thời gian tính toán E’

    Chú ý: Để cho gọn, mỗi biểu thức đủ trong input/output file có thể viết mà không cần đến cặp dấu ngoặc ngoài cùng, dữ liệu vào được coi là đúng đắn và không cần kiểm tra.

    Ví dụ:

    150 bài Toán Tin 15

    02. BẢNG SỐ

    Cho một bảng hình chữ nhật kích thước M x N với M, N nguyên dương. M, N ≤ 50. Hình chữ nhật này được chia thành M x N ô vuông bằng nhau với kích thước đơn vị bởi các đường song song với các cạnh, trên ô vuông [i, j] ghi số nguyên A[i, j] (2 ≤ A[i, j] ≤ 50).

    Từ mảng A ta lập mảng B mà B[i, j] được xây dựng như sau:

    Biểu diễn số A[i, j] thành tổng các số nguyên tố với ràng buộc: trong biểu diễn đó có nhiều nhất chỉ một số nguyên tố xuất hiện hai lần. Trong các cách biểu diễn, chọn ra biểu diễn nhiều hạng tử nhất thì B[i, j] bằng số số hạng của biểu diễn này kể cả bội (nếu có).

    Ví dụ:

    Nếu A[i, j] = 10 = 2 + 3 + 5 thì B[i, j] = 3;

    Nếu A[i, j] = 12 = 2 + 2 + 3 + 5 thì B[i, j] = 4;

    Chú ý: Không được biểu diễn A[i, j] = 10 = 2 + 2 + 2 + 2 + 2 để có B[i, j] = 5 vì như vậy không thoả mãn ràng buộc

    1. Dữ liệu vào được cho bởi Text file INP trong đó:
      • Dòng đầu ghi hai số M, N
      • M dòng sau, dòng thứ i ghi N phần tử trên dòng i của bảng A: A[i, 1], A[i, 2], …, A[i, N] hai phần tử liên tiếp cách nhau ít nhất một dấu trống.
    2. Kết quả ghi ra Text file OUT.
      Giá trị bảng B, mỗi dòng của bảng ghi trên một dòng của file, hai phần tử liên tiếp cách nhau ít nhất một dấu trống.
    3. Hãy tìm hình chữ nhật lớn nhất được tạo bởi các ô mang giá trị bằng nhau của bảng B. Ghi tiếp ra file OUT.B1 một dòng gồm 5 số là: diện tích lớn nhất tìm được, toạ độ trên trái và dưới phải của hình chữ nhật có diện tích lớn nhất đó.

    03.   CARGO

    Bản đồ một kho hàng hình chữ nhật kích thước mxn được chia thành các ô vuông đơn vị (m hàng, n cột: các hàng đánh số từ trên xuống dưới, các cột đánh số từ trái qua phải). Trên các ô của bản đồ có một số ký hiệu:

    • Các ký hiệu # đánh dấu các ô đã có một kiện hàng xếp sẵn,
    • Một ký hiệu *: Đánh dấu ô đang có một xe đẩy
    • Một ký hiệu $: Đánh dấu ô chứa kiện hàng cần xếp
    • Một ký hiệu @: Đánh dấu vị trí ô mà cần phải xếp kiện hàng B vào ô đó
    • Các ký hiệu dấu chấm “.”: Cho biết ô đó trống

    Cần phải dùng xe đẩy ở * để đẩy kiện hàng ở $ đến vị trí @ sao cho trong quá trình di chuyển cũng như đay hàng, không chạm vào những kiện hàng đã được xếp sẵn. (Xe đay có thể di chuyển sang một trong 4 ô chung cạnh với ô đang đứng). Nếu có nhiều phương án thì chỉ ra một phương án sao cho xe đay phải di chuyển qua ít bước nhất.

    Các hướng di chuyển được chỉ ra trong hình dưới đây

    150 bài toán tin lê minh hoàng

    Dữ liệu: Vào từ file văn bản CARGO.INP

    • Dòng 1: Ghi hai số nguyên dương m, n cách nhau một dấu cách (m, n ≤ 80)
    • m dòng tiếp theo, dòng thứ i ghi đủ n ký hiệu trên hàng thứ i của bản đồ theo đúng thứ tự từ trái qua phải. Các ký hiệu được ghi liền nhau

    Kết quả: Ghi ra file văn bản CARGO.OUT

    • Dòng 1: Ghi số bước di chuyển xe đNy để thực hiện mục đích yêu cầu, nếu không có phương án khả thi thì dòng này ghi số -1
    • Dòng 2: Nếu có phương án khả thi thì dòng này ghi các ký tự liền nhau thể hiện hướng di chuyển của xe đNy R (East, West, South, North). Các chữ cái thường (e,w,s,n) thể hiện bước di chuyển không đNy hàng, các chữ cái in hoa (E,W,S,N) thể hiện bước di chuyển có đNy hàng.

    Ví dụ:

    150 bài Toán Tin 16

    04.   DÃY CON

    Cho một dãy gồm n ( n ≤ 1000) số nguyên dương A1, A2, …, An và số nguyên dương k (k ≤ 50). Hãy tìm dãy con gồm nhiều phần tử nhất của dãy đã cho sao cho tổng các phần tử của dãy con này chia hết cho k.

    Dữ liệu vào: file văn bản DAY.INP

    • Dòng đầu tiên chứa hai số n, k ghi cách nhau bởi ít nhất 1 dấu trống.
    • Các dòng tiếp theo chứa các số A1, A2, …, An được ghi theo đúng thứ tự cách nhau ít nhất một dấu trống hoặc xuống dòng (CR-LF).

    Kết quả: ghi ra file văn bản DAY.OUT

    • Dòng đầu tiên ghi m là số phần tử của dãy con tìm được.
    • Các dòng tiếp theo ghi dãy m chỉ số các phần tử của dãy đã cho có mặt trong dãy con tìm được. Các chỉ số ghi cách nhau ít nhất một dấu trắng hoặc một dấu xuống dòng.

    Ví dụ: 

    DAY.INP DAY.OUT
    10 3 9
    2 3 5 7 1 3 2 4 5
    9 6 12 7 6 7 10 8
    11 15

    05. XÂU FIBINACCI

    Xét dãy các xâu F1, F2, F3, …, FN, … trong đó:

    F1 = ‘A’

    F2 = ‘B’

    FK+1 = FK + FK-1 (K ³ 2).

    Ví dụ:

    F1 = ‘A’

    F2 = ‘B’ F3 = ‘BA’ F4 = ‘BAB’

    F5 = ‘BABBA’

    F6 = ‘BABBABAB’

    F7 = ‘BABBABABBABBA’

    F8 = ‘BABBABABBABBABABBABAB’

    F9 = ‘BABBABABBABBABABBABABBABBABABBABBA’

    Cho xâu S độ dài không quá 25, chỉ bao gồm các ký tự ‘A’ và ‘B’. Hãy xác định số lần xuất hiện xâu S trong xâu FN, N ≤ 35. Chú ý: hai lần xuất hiện của S trong FN không nhất thiết phải là các xâu rời nhau hoàn toàn.

    Dữ liệu: vào từ file văn bản FIBISTR.INP, bao gồm nhiều dòng, mỗi dòng có dạng N S. Giữa N và S có đúng 1 dấu cách. Dữ liệu vào là chuNn, không cần kiểm tra.

    Kết quả: Đưa ra file văn bản FIBISTR.OUT, mỗi dòng dữ liệu ứng với một dòng kết quả ra.

    06.   VÒNG SỐ NGUYÊN TỐ

    Một vòng tròn chứa 2n vòng tròn nhỏ (Xem hình vẽ). Các vòng tròn nhỏ được đánh số từ 1 đến n theo chiều kim đồng hồ. Cần điền các số tự nhiên từ 1 đến 2n mỗi số vào một vòng tròn nhỏ sao cho tổng của hai số trên hai vòng tròn nhỏ liên tiếp là số nguyên tố. Số điền ở vòng tròn nhỏ 1 luôn là số 1.

    vong so nguyen to

    Dữ liệu: Vào từ file văn bản CIRCLE.INP chứa số nguyên dương n (1 < n < 10)

    Kết quả: Ghi ra file văn bản CIRCLE.OUT:

    • Dòng đầu tiên ghi số lượng các cách điền số tìm được (k).
    • Dòng thứ i trong số k dòng tiếp theo ghi các số trong các vòng tròn nhỏ bắt đầu từ vòng tròn nhỏ 1 đọc theo thứ tự của các vòng tròn nhỏ.

    07.   ĐÔI BẠN

    Trước kia Tuấn và Mai là hai bạn cùng lớp còn bây giờ hai bạn học khác trường nhau. Cứ mỗi sáng, đúng 6 giờ cả hai đều đi từ nhà tới trường của mình theo con đường mất ít thời gian nhất (có thể có nhiều con đường đi mất thời gian bằng nhau và đều ít nhất). Nhưng hôm nay, hai bạn muốn gặp nhau để bàn việc họp lớp cũ nhân ngày 20-11.

    Cho biết sơ đồ giao thông của thành phố gồm N nút giao thông được đánh số từ 1 đến N và M tuyến đường phố (mỗi đường phố nối 2 nút giao thông). Vị trí nhà của Mai và Tuấn cũng như trường của hai bạn đều nằm ở các nút giao thông. Cần xác định xem Mai và Tuấn có cách nào đi thoả mãn yêu cầu nêu ở trên, đồng thời họ lại có thể gặp nhau ở nút giao thông nào đó trên con đường tới trường hay không ? (Ta nói Tuấn và Mai có thể gặp nhau tại một nút giao thông nào đó nếu họ đến nút giao thông này tại cùng một thời điểm). Nếu có nhiều phương án thì hãy chỉ ra phương án để Mai và Tuấn gặp nhau sớm nhất.

    Dữ liệu vào được đặt trong tệp FRIEND.INP:

    • Dòng đầu tiên chứa 2 số nguyên dương N, M (1 ≤ N ≤ 100);
    • Dòng tiếp theo chứa 4 số nguyên dương Ha, Sa, Hb, Sb lần lượt là số hiệu các nút giao thông tương ứng với: Nhà Tuấn, trường của Tuấn, nhà Mai, trường của
    • Dòng thứ i trong số M dòng tiếp theo chứa 3 số nguyên dương A, B, T. Trong đó A & B là hai đầu của tuyến đường phố i. Còn T là thời gian (tính bằng giây ≤ 1000) cần thiết để Tuấn (hoặc Mai) đi từ A đến B cũng như từ B đến A.

    Giả thiết là sơ đồ giao thông trong thành phố đảm bảo để có thể đi từ một nút giao thông bất kỳ đến tất cả các nút còn lại.

    Kết quả : Ghi ra tệp văn bản FRIEND.OUT

    • Dòng 1: Ghi từ YES hay NO tuỳ theo có phương án giúp cho hai bạn gặp nhau hay không. Trong trường hợp có phương án:
    • Dòng 2: Ghi thời gian ít nhất để Tuấn tới trường
    • Dòng 3: Ghi các nút giao thông theo thứ tự Tuấn đi qua
    • Dòng 4: Ghi thời gian ít nhất để Mai tới trường
    • Dòng 5: Ghi các nút giao thông theo thứ tự Mai đi qua
    • Dòng 6: Ghi số hiệu nút giao thông mà hai bạn gặp nhau
    • Dòng 7: Thời gian sớm nhất tính bằng giây kể từ 6 giờ sáng mà hai bạn có thể gặp nhau.

    Các số trên một dòng của Input/Output file ghi cách nhau ít nhất một dấu cách.

    Ví dụ : Với sơ đồ giao thông sau: (N=6,M=7, Ha=1, Sa=6, Hb=2, Sb=5)

    150 bài Toán Tin 17

    08.   CỬA SỔ VĂN BẢN

    Xét văn bản T gồm N ký tự (N ≤ 1000000, N không cho trước) và văn bản P gồm M ký tự (0 < M ≤ 100). Cửa sổ độ dài W là một đoạn văn bản gồm W ký tự liên tiếp của T (M < W ≤ 1000). Nói cửa sổ W chứa mẫu P nếu tồn tại một cách xoá một số ký tự liên tiếp của W để nhận được P.

    Hai cửa sổ của T gọi là khác nhau nếu chúng bắt đầu từ những vị trí khác nhau trong T. Hãy xác định số cửa sổ khác nhau trong văn bản T chứa P.

    Dữ liệu:

    • File văn bản INP
    • Dòng đầu chứa hai số nguyên W, M
    • Dòng thứ hai chứa M ký tự của văn bản P;
    • File TXT chứa văn bản T

    Kết quả:

    Đưa ra file WINDOW.OUT một số nguyên xác định số cửa sổ tìm được theo yêu cầu.

    Lưu ý: Đa số trường hợp, file WINDOWT.TXT không phải là Text file, có nghĩa là nó chứa các ký tự trong khoảng  #0..#255 (file of Char). Như vậy tính cả CR(#13) và LF(#10)

    Ví dụ:
    WINDOWP.INP WINDOWT.TXT WINDOW.OUT
    4 2

    is

    This is a sample text for the

    first task on the contest

    8

    09. VÒNG TRÒN CON

    Cho hai dãy số nguyên a1, a2, …, am và b1, b2, …, bn (2 ≤ m, n ≤ 100)

    Các số này được xếp quanh hai vòng tròn A và B: các số ai quanh vòng tròn A và các số bj quanh vòng tròn B. Vòng tròn C được gọi với các số quanh nó c1, c2, …, cp được gọi là vòng tròn con của A (hoặc của B) nếu tồn tại một cách xoá bớt các số của A (hoặc của B) để được vòng tròn C. Hãy tìm vòng tròn C là vòng tròn con của cả A và B với số phần tử (p) lớn nhất có thể.

    Chú ý: Các số trên 3 vòng tròn A, B, C được xếp theo đúng thứ tự trong dãy theo cùng một chiều kim đồng hồ.

    Dữ liệu: Vào từ file văn bản CIRCLE.INP

    • Dòng đầu chứa hai số nguyên m, n cách nhau ít nhất một dấu cách.
    • m dòng tiếp theo, dòng thứ i ghi số ai
    • n dòng tiếp theo, dòng thứ j ghi số bj

    Kết quả: Đưa ra file văn bản CIRCLE.OUT

    • Dòng đầu ghi số nguyên p
    • p dòng sau, dòng thứ k ghi số ck.

    10.   BỐ TRÍ PHÒNG HỌP

    Có n cuộc họp đánh số từ 1 đến n đăng ký làm việc tại một phòng hội thảo. Cuộc họp i cần được bắt đầu ngay sau thời điểm si và kết thúc tại thời điểm fi. Hỏi có thể bố trí phòng hội thảo phục vụ được nhiều nhất bao nhiêu cuộc họp, sao cho khoảng thời gian làm việc của hai cuộc họp bất kỳ là không giao nhau.

    Dữ liệu vào từ file văn bản ACTIVITY.INP

    • Dòng đầu tiên chứa số nguyên dương n ( n ≤ 10000)
    • Dòng thứ i trong số n dòng tiếp theo chứa hai số nguyên dương si, fi (si < fi ≤ 32000) (i: 1 ≤ i ≤n).

    Kết quả: Ghi ra file ACTIVITY.OUT

    • Dòng đầu tiên ghi số K là số các cuộc họp được chấp nhận phục vụ
    • K dòng tiếp theo liệt kê số hiệu các cuộc họp được chấp nhận theo thứ tự từ cuộc họp đầu tiên tới cuộc họp cuối cùng , mỗi dòng ghi số hiệu một cuộc họp.

    11.   MUA VÉ TÀU HOẢ

    Tuyến đường sắt từ thành phố A đến thành phố B đi qua một số nhà ga. Tuyến đường có thể biểu diễn bởi một đoạn thẳng, các nhà ga là các điểm trên đó. Tuyến đường bắt đầu từ A và kết thúc ở B, vì thế các nhà ga sẽ được đánh số bắt đầu từ A (có số hiệu là 1) và B là nhà ga cuối cùng.

    Giá vé đi lại giữa hai nhà ga chỉ phụ thuộc vào khoảng cách giữa chúng. Cách tính giá vé được cho trong bảng sau đây:

    Khoảng cách giữa hai nhà ga (X) Giá vé
    0 < X ≤ L1 C1
    L1 < X ≤ L2 C2
    L2 < X ≤ L3 C3

    Vé để đi thẳng từ nhà ga này đến nhà ga khác chỉ có thể đặt mua nếu khoảng cách giữa chúng không vượt quá L3. Vì thế nhiều khi để đi từ nhà ga này đến nhà ga khác ta phải đặt mua một số vé. Hơn thế nữa, nhân viên đường sắt yêu cầu hành khách chỉ được giữ đúng một vé khi đi trên tàu và vé đó sẽ bị huỷ khi hành khách xuống tàu.

    Ví dụ, trên tuyến đường sắt cho như sau:

    bai toan tin mua ve tau hoa

    Để đi từ ga 2 đến ga 6 không thể mua vé đi thẳng. Có nhiều cách mua vé để đi từ ga 2 đến ga 6: Chẳng hạn đặt mua vé từ ga 2 đến ga 3 mất chi phí C2 sau đó mua vé từ ga 3 đến ga 6 mất chi phí C3, và chi phí tổng cộng khi đi theo cách này là C2 + C3. Hoặc mua vé từ ga 2 đến ga 4 mất chi phí C2, sau đó mua vé từ ga 4 đến ga 5 mất chi phí C2 và mua vé từ ga 5 đến ga 6 mất chi phí C1, như vậy chi phí tổng cộng là 2C2 + C1. Lưu ý rằng mặc dù khoảng cách giữa ga 2 và ga 6 bằng 12 = 2 L2 nhưng không được phép mua 2 vé với giá C2 để đi thẳng từ ga 2 đến ga 6.

    Yêu cầu: Tìm cách đặt mua vé để đi lại giữa hai nhà ga cho trước với chi phí mua vé là nhỏ nhất.

    Dữ liệu vào từ file văn bản RTICKET.INP

    • Dòng đầu tiên ghi các số nguyên L1, L2, L3, C1, C2, C3 (1 ≤ L1 < L2 < L3 ≤ 109; 1 ≤ C1 < C2 < C3≤ 109) theo đúng thứ tự liệt kê ở trên.
    • Dòng thứ hai chứa số lượng nhà ga N ( 2 ≤ N ≤ 10000).
    • Dòng thứ ba ghi hai số nguyên s, f là các chỉ số của hai nhà ga cần tìm cách đặt mua vé với chi phí nhỏ nhất để đi lại giữa chúng.
    • Dòng thứ i trong số N – 1 dòng tiếp theo ghi số nguyên là khoảng cách từ nhà ga A (ga 1) đến nhà ga thứ i + 1. Chi phí ít nhất từ nhà ga đầu tiên A đến nhà ga cuối cùng B không vượt quá 109.

    Kết quả ghi ra file văn bản RTICKET.OUT chi phí nhỏ nhất tìm được.

    12.   XIN CHỮ KÝ

    Giám đốc một công ty trách nhiệm hữu hạn muốn xin chữ ký của ông Kiến trúc sư trưởng thành phố phê duyệt dự án xây dựng trụ sở làm việc của công ty. Ông kiến trúc sư trưởng chỉ ký vào giấy phép khi bà thư ký của ông ta đã ký duyệt vào giấy phép. Bà thư ký làm việc tại tầng thứ M của toà nhà trụ sở làm việc gồm M tầng của Văn phòng Kiến trúc sư trưởng thành phố. Các tầng của toà nhà được đánh số từ 1 đến M, từ thấp đến cao. Mỗi tầng của toà nhà có N phòng được đánh số từ 1 đến N từ trái qua phải. Trong mỗi phòng chỉ có một nhân viên làm việc. Giấy phép chỉ được bà thư ký ký duyệt khi đã có ít nhất một nhân viên ở tầng M đã ký xác nhận. Ngoài bà thư ký, một nhân viên bất kỳ chỉ ký xác nhận vào giấy phép khi có ít nhất một trong các điều kiện sau được thoả mãn:

    1. Nhân viên đó làm việc ở tầng 1
    2. Giấy phép đã được ký xác nhận bởi nhân viên làm việc ở cùng số phòng trong tầng sát dưới
    3. Giấy phép đã được ký xác nhận bởi nhân viên làm việc ở cùng số phòng trong tầng sát trên
    4. Giấy phép đã được ký xác nhận bởi nhân viên làm việc ở phòng bên cạnh

    Mỗi một nhân viên (kể cả bà thư ký) khi ký xác nhận đều đòi một khoản lệ phí. Hãy chỉ ra cách xin được chữ ký của Kiến trúc sư trưởng đòi hỏi tổng lệ phí phải trả là nhỏ nhất (giả thiết rằng riêng chữ ký của Kiến trúc sư trưởng không mất lệ phí).

    Dữ liệu vào từ file văn bản SIGN.INP

    • Dòng đầu tiên chứa ba số M, N, P (1 ≤ M ≤ 50; 1 ≤ N ≤ 100; 1 ≤ P ≤ N) ở đây P là số phòng bà thư ký.
    • Dòng thứ i trong số M dòng tiếp theo chứa N số nguyên dương theo thứ tự là lệ phí phải trả cho các nhân viên ở các phòng 1, 2, …, N trên tầng Các số này không vượt quá 109 và giả thiết rằng tổng chi phí cần trả cũng không vượt quá 109.

    Kết quả: Ghi ra file văn bản SIGN.OUT 

    • Dòng đầu tiên ghi 2 số F, K theo thứ tự là chi phí cần trả và số lượng phòng cần đi qua.
    • K dòng tiếp theo, mỗi dòng ghi số tầng và số phòng của một phòng theo thứ tự cần đi qua. (Các số trên 1 dòng của input/output file cách nhau ít nhất 1 dấu trống)

    13.   LẮC NẠM KIM CƯƠNG

    Lắc là một đồ trang sức rất được các cô gái ưa chuộng. Chính vì vậy mà chúng phải được chế tạo thật đẹp và đa dạng. Xét việc chế tạo lắc có m mắt xích, mỗi mắt được nạp một viên kim cương. Có n loại viên kim cương khác nhau, n ≤ 7; 2  ≤  m  ≤  27-n + 19.

    Hai lắc được gọi là khác nhau nếu ta không thể tìm cách đặt sao cho các mắt tương ứng có kim cương cùng loại. Lưu ý rằng lắc có hình vòng.

    Với m và n cho trước, hãy xác định xem có thể tồn tại bao nhiêu loại lắc khác nhau.

    Các loại kim cương được ký hiệu là A, B, C, … Một cấu hình lắc được xác định bởi một xâu m ký tự A, B, C, … và bắt đầu bằng ký tự nhỏ nhất.

    Cho số thứ tự l, hãy xác định cấu hình tương ứng (Các cấu hình được sắp xếp theo thứ tự từ điển).

    Dữ liệu: Vào từ file BRASLET.INP có dạng

    m n l1

    l2

    Kết quả: Đưa ra file BRASLET.OUT

    K – Số lượng lắc khác nhau s1

    s2

    … (si xác định cấu hình lắc tương ứng với li)

    14.   RẢI SỎI

    Xét trò chơi rải sỏi với một người chơi như sau: Cho cây T và một đống sỏi gồm K viên ở mỗi bước người ta lấy 1 viên sỏi từ đống sỏi và đặt vào một nút lá tuỳ chọn.

    Nếu nút p có r nút lá và tất cả và tất cả các nút lá đều có sỏi thì người ta gom tất cả các viên sỏi ở lá lại, đặt 1 viên ở nút p, xoá các nút lá của nó và hoàn trả r – 1 viên sỏi còn lại vào đống sỏi.

    Trò chơi kết thúc khi đã đặt được 1 viên sỏi vào nút gốc.

    Nhiệm vụ đặt ra là theo cấu trúc của cây T, xác định số viên sỏi tối thiểu ban đầu để trò chơi có thể kết thúc bình thường. Cây có n nút ( N ≤ 400), nút gốc được đánh số là 1.

    Dữ liệu: vào từ file văn bản STONE.INP

    • Dòng đầu: số n
    • Dòng thứ i trong số n dòng tiếp theo có dạng: i m i1 i2 … im. Trong đó m là số nút con của nút i; i1, i2, …, im: Các nút con của nút i.

    Kết quả: đưa ra file STONE.OUT số lượng viên sỏi tối thiểu cần thiết

    15.   ĐIỆP VIÊN

    Địa bàn hoạt động của một điệp viên là một khu phố mà ở đó chỉ có các đường phố ngang, dọc tạo thành một lưới ô vuông. Với mục đích bảo mật, thay vì tên đường phố, điệp viên đánh số các phố ngang từ 0 đến m và các phố dọc từ 0 đến n. ở một số ngã ba hoặc ngã tư có các trạm kiểm soát. Anh ta đang đứng ở nút giao của hai đường (i1, j1) (j1 – đường ngang; i1 – đường dọc) và cần tới điểm hẹn ở giao của hai đường (i2, j2). Để tránh bị theo dõi, đường đi phải không qua các trạm kiểm soát và cứ tới chỗ rẽ thì nhất thiết phải đổi hướng đi, thậm chí có thể sang đường và đi ngược trở lại. Việc đổi hướng chỉ được thực hiện ở ngã ba hoặc ngã tư. Hãy xác định đường đi ngắn nhất tới điểm hẹn hoặc cho biết không có đường đi đáp ứng được yêu cầu đã nêu.

    Dữ liệu: vào từ file SPY.INP

    Dòng đầu: m n i1 j1 i2 j2 ( 0 ≤ m, n ≤ 100)

    Các dòng sau: mỗi dòng 2 số i, j (toạ độ trạm kiểm soát).

    Kết quả: đưa ra file SPY.OUT

    Dòng đầu: độ dài đường đi ngắn nhất hoặc thông báo NO nếu không có đường đi.

    Các dòng sau: mỗi dòng 2 số i, j chỉ nút tiếp theo cần tới theo đường đi tìm được, bắt đầu là i1 j1 và kết thúc là i2 j2.

    16.   KHOẢNG CÁCH GIỮA HAI XÂU

    Cho hai xâu ký tự S1 và S2, mỗi xâu có độ dài không quá 100 ký tự. Cho phép thực hiện các phép biến đổi sau đây đối với xâu ký tự:

    1. Thay thế một ký tự nào đó bởi ký tự khác
    2. Đổi chỗ hai ký tự liền nhau
    3. Chèn một ký tự vào sau vị trí nào đó
    4. Xoá bớt 1 ký tự

    Ta gọi khoảng cách giữa hai xâu S1 và S2 là số ít nhất các phép biến đổi nêu trên cần áp dụng đối với xâu S1 để biến nó thành xâu S2.

    Yêu cầu: Tính khoảng cách giữa 2 xâu S1, S2 cho trước và chỉ ra thứ tự các phép biến đổi.

     Ví dụ: Giả sử S1 = ‘Barney’; S2 = ‘brawny’. Khoảng cách giữa 2 xâu là 4. Dãy các phép biến đổi cần thực hiện là:

    1. Thay ký tự 1 của S1 (B) bởi b
    2. Đổi chỗ ký tự thứ 2 (a) và thứ 3 (r) của S1.
    3. Chèn ký tự w vào S1 sau ký tự thứ
    4. Xoá ký tự thứ 5 của S1.

    Dãy các phép biến đổi có thể mô tả như sau:

    ‘Barney’ ® ‘barney’ ® ‘braney’ ® ‘brawney’ ® ‘brawny’

    Dữ liệu: vào từ file văn bản STREDIT.INP có cấu trúc như sau:

    • Dòng đầu tiên chứa xâu S1
    • Dòng thứ hai chứa xâu S2

    Kết quả: Ghi ra file văn bản STREDIT.OUT

    • Dòng đầu tiên ghi số lượng các phép biến đổi cần sử dụng K
    • Mỗi dòng i trong số K dòng tiếp theo mô tả phép biến đổi được sử dụng ở lần thứ i gồm các tham số sau: các tham số ghi trên 1 dòng ghi cách nhau 1 dấu cách.
      • 1, P, C (nếu là phép thay ký tự tại vị trí P bằng ký tự C)
      • 2, I, I + 1 (nếu là phép đổi chỗ 2 ký tự thứ I và thứ I + 1)
      • 3, P, C (nếu là phép chèn ký tự C vào sau vị trí P)
      • 4, P (nếu là phép xoá ký tự thứ P)

    17.   XẾP LẠI BẢNG SỐ

    Cho một bảng ô vuông gồm m hàng và n cột. Các ô được đánh chỉ số theo (hàng, cột) từ (0, 0) đến (m – 1, n – 1). Trên m x n ô người ta viết các số tự nhiên từ 0 đến m x n – 1 theo một thứ tự tuỳ ý. Cho phép đổi chỗ hai số đặt trong hai ô ở thế mã giao chân. Cần tìm cách đổi chỗ các số sao cho thu được bảng có tính chất: Số ở ô (i, j) là n x i + j.

    Dữ liệu vào từ file văn bản BOARD.INP: các số ghi trên 1 dòng cách nhau ít nhất 1 dấu trống.

    • Dòng đầu ghi 2 số m, n (5 ≤ m, n ≤ 80)
    • m dòng tiếp theo, dòng thứ i ghi n số tự nhiên theo đúng thứ tự các số ghi trên hàng i của bảng.

    Kết quả đưa ra file BOARD.OUT

    • Dòng thứ i chứa 4 số X1, Y1, X2, Y2 cho biết tại bước thứ i cần đổi chỗ 2 số tại hai ô (X1, Y1) và (X2, Y2)

    18.   THĂM KHU TRIỂN LÃM

    Một khu triển lãm nghệ thuật có mxn phòng được bố trí trong một hình chữ nhật kích thước mxn (2≤m,n≤ 20). Mỗi phòng biểu diễn bởi một ô và đều có cửa thông với các phòng chung cạnh với nó. Với mỗi một phòng, ta đánh chỉ số theo toạ độ (x, y) của ô (1 ≤hàng x≤m; 1≤cột y≤n) và gán cho nó một chữ cái in hoa (‘A’..’Z’) thể hiện loại nghệ thuật trưng bày tại phòng đó. Có thể vào khu triển lãm ở các phòng có toạ độ (x bất kỳ, y = 1) và có thể đi ra ở các phòng có toạ độ (x bất kỳ, y = n)

    150 bài Toán Tin 18
    Ví dụ với m=10 và n=11

    Một vị thủ tướng đi thăm triển lãm có sở thích đặc biệt với một loại nghệ thuật. Yêu cầu của ông ta “rất đơn giản” là không nhất thiết phải đi thăm tất cả các phòng chứa loại nghệ thuật mà ông ta thích nhưng không được đi qua các phòng chứa loại nghệ thuật khác.

    Ví dụ: Để đi thăm loại nghệ thuật B, Thủ tướng có thể đi:

    (1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (2,6), (3,6), (4,6), (4,7), (4,8), (4,9), (4,10), (5,10), (6,10),(6,11).

    Nhưng không phải luôn tồn tại đường đi như vậy, ví dụ : nếu Thủ tướng muốn đi thăm loại nghệ thuật A thì không thể tìm được một đường đi (Bởi cột 6 của bảng không có một chữ A nào).

    Để có đường đi của vị thủ tướng đi thăm loại nghệ thuật A thì những người quản lý triển lãm phải tìm cách đổi loại nghệ thuật tại hai phòng nào đó. Trong ví dụ này thì để có đường đi chúng ta có thể đổi loại nghệ thuật B ở phòng (5,6) cho loại nghệ thuật A ở phòng (3,1) hoặc phòng (3,7), (3,8),

    Trong những cách đổi đó, người ta thường quan tâm đến việc phải đổi sao cho tổng số phòng phải đổi là ít nhất có thể được. Trong những cách đổi với số cặp phòng phải đổi ít nhất hãy chỉ ra cách đổi mà con đường thủ tướng phải đi là ngắn nhất có thể được. Có thể có nhiều nghiệm thì chỉ cần chỉ ra một nghiệm.

    Dữ liệu vào từ file văn bản TL.INP bao gồm:

    • Dòng đầu tiên ghi số m, n
    • Dòng thứ hai ghi một chữ cái in hoa thể hiện loại nghệ thuật thủ tướng muốn thăm.
    • m dòng tiếp theo, dòng thứ i là một xâu ký tự độ dài n biểu diễn các loại nghệ thuật trong các phòng trên hàng i theo đúng thứ tự từ cột 1 đến cột n.

    Kết quả cho ra file văn bản TL.OUT bao gồm:

    • Dòng đầu tiên là số cặp phòng cần đổi (p).
    • p dòng tiếp theo mỗi dòng gồm 4 số a, b, c, d có nghĩa là ta cần đổi loại nghệ thuật tại phòng (a,b) cho phòng (c,d).
    • Dòng tiếp theo ghi số phòng trên con đường đi ngắn nhất tìm được (q).
    • q dòng tiếp theo, mỗi dòng ghi toạ độ x,y thể hiện cho con đường ngắn nhất đó theo đúng thứ tự phòng đi qua.
    • Nếu không tồn tại phương án đổi phòng để có đường đi thì ghi vào file OUT một dòng:

    NO SOLUTION

    Ví dụ: Với khu triển lãm như trên:

    TL.INP TL.OUT
    10 11 0
    B 16
    BBBBBBFFFFF 1 1
    AAAAABDCCFF 1 2
    AFFFABAACFC 1 3
    BFEFABBBBBD 1 4
    FFDEABAAABA 1 5
    EEDEEEEEABB 1 6
    DDDEEEEEAAB 2 6
    DCCFFFCCABA 3 6
    DCCFFFCCAAA 4 6
    CCCCCCCCCCC 4 7
    4 8
    4 9
    4 10
    5 10
    6 10
    6 11

      

    TL.INP TL.OUT
    10 11 1
    A 5 6 3 1
    BBBBBBFFFFF 18
    AAAAABDCCFF 2 1
    AFFFABAACFC 2 2
    BFEFABBBBBD 2 3
    FFDEABAAABA 2 4
    EEDEEEEEABB 2 5
    DDDEEEEEAAB 3 5
    DCCFFFCCABA 4 5
    DCCFFFCCAAA 5 5
    CCCCCCCCCCC 5 6
    5 7
    5 8
    5 9
    6 9
    7 9
    8 9
    9 9
    9 10
    9 11

    19.   DÒ MÌN

    Cho một bãi mìn kích thước mxn ô vuông, trên một ô có thể có chứa một quả mìn hoặc không, để biểu diễn bản đồ mìn đó, người ta có hai cách:

    • Cách 1: dùng bản đồ đánh dấu: sử dụng một lưới ô vuông kích thước mxn, trên đó tại ô (i, j) ghi số 1 nếu ô đó có mìn, ghi số 0 nếu ô đó không có mìn
    • Cách 2: dùng bản đồ mật độ: sử dụng một lưới ô vuông kích thước mxn, trên đó tại ô (i, j) ghi một số trong khoảng từ 0 đến 8 cho biết tổng số mìn trong các ô lân cận với ô (i, j) (ô lân cận với ô (i, j) là ô có chung với ô (i, j) ít nhất 1 đỉnh).

    Giả thiết rằng hai bản đồ được ghi chính xác theo tình trạng mìn trên hiện trường.

    Ví dụ: Bản đồ đánh dấu và bản đồ mật độ tương ứng: (m = n = 10)

    150 bài Toán Tin 19

    Về nguyên tắc, lúc cài bãi mìn phải vẽ cả bản đồ đánh dấu và bản đồ mật độ, tuy nhiên sau một thời gian dài, khi người ta muốn gỡ mìn ra khỏi bãi thì vấn đề hết sức khó khăn bởi bản đồ đánh dấu đã bị thất lạc !!. Công việc của các lập trình viên là: Từ bản đồ mật độ, hãy tái tạo lại bản đồ đánh dấu của bãi mìn.

     Dữ liệu: Vào từ file văn bản MINE.INP, các số trên 1 dòng cách nhau ít nhất 1 dấu cách

    • Dòng 1: Ghi 2 số nguyên dương m, n (2 ≤ m, n ≤ 80)
    • m dòng tiếp theo, dòng thứ i ghi n số trên hàng i của bản đồ mật độ theo đúng thứ tự từ trái qua phải.

    Kết quả: Ghi ra file văn bản MINE.OUT, các số trên 1 dòng ghi cách nhau ít nhất 1 dấu cách

    • Dòng 1: Ghi tổng số lượng mìn trong bãi
    • m dòng tiếp theo, dòng thứ i ghi n số trên hàng i của bản đồ đánh dấu theo đúng thứ tự từ trái qua phải.

    Các bài tiếp theo, mời bạn đọc tải tại đây 150 BAI TOAN TIN – LE MINH HOANG

  • Bài tập HSG Tin học THPT

    Bài tập HSG Tin học THPT

    Chúng tôi xin giới thiệu 16 Bài tập HSG Tin học THPT gồm các bài tập: Điệp viên, Trư bát giới, Bàn cờ 4 * 4, Đội cờ, Hệ thống xe buýt, Bố trí phòng họp, Phân phối kênh, Trò chơi với ô chữ, Công việc, Mã hoá Burrows wheeler, Mặt phẳng, Truyền tin ngắn nhất, Robot quét vôi, Vườn Táo, Dãy lồi.

    Quý thầy cô và các em học sinh có thể tham khảo thêm Giải thuật Đệ quy là gì?

    1. Bài tập HSG Tin học THPT: Điệp viên

    Một điệp viên trưởng phụ trách một nước nọ trước khi về nước muốn gặp nhân viên của mình để nghe báo cáo. Hai người đang ở hai thành phố khác nhau vì vậy họ phải di chuyển để gặp nhau. Quy tắc di chuyển như sau:

    • Họ di chuyển vào ban ngày và nghỉ tại một thành phố vào buổi tối.
    • Trong ngày, họ chỉ có thể di chuyển từ một thành phố tới thành phố bên cạnh (có đường đi trực tiếp và các đường đi này là 1 chiều).
    • Để bảo đảm an toàn, các điệp viên luôn luôn di chuyển (không dừng tại một thành phố quá một đêm).
    • Hai người có thể gặp nhau nếu họ ở cùng1 thành phố vào buổi tối.

    Yêu cầu: Lập chương trình kiểm tra xem hai người có gặp nhau không.

    Dữ liệu: agent.inp

    • Dòng đầu ghi 2 số: n là số thành phố, m là số các đường đi trực tiếp giữa các thành phố (n <=50, m<=100).
    • Dòng tiếp theo là 2 số p, q là vị trí hiện thời của hai điệp viên.
    • M dòng tiếp theo mỗi dòng chứa 2 số ai, aj là số hiêu các thành phố và từ ai có đường đi trực tiếp (một chiều) đến aj.

    Kết quả: agent.out

    • Nếu 2 người không gặp nhau in ra từ “No”
    • Nếu 2 người gặp nhau in ra t là số ngày ngắn nhất mà hai người có thể gặp nhau.

    Ví dụ:

    Agent.in1 Agent.ou1 Agent.in2 Agent.ou2 Agent.in3 Agent.ou3 Agent.in4 Agent.ou4
    6 7

    1 5

    1 2

    4 5

    2 3

    3 4

    4 1

    5 4

    5 6

    3 3 3

    1 3

    1 2

    2 3

    3 1

    No 8 9

    1 8

    1 2

    2 3

    3 4

    4 1

    1 5

    5 6

    6 7

    7 8

    8 1

    5 8 9

    2 8

    1 2

    2 3

    3 4

    4 1

    1 5

    5 6

    6 7

    7 8

    8 1

    11

    Hướng dẫn: Sử dụng thuật toán: Loang theo lớp

    Bài toán này là một điển hình cho thuật toán “loang theo lớp”. Ta loang theo chiều rộng đường đi của 2 điệp viên theo trình tự: loang đường đi của người thứ nhất tại thời điểm i một lần rồi loang đường đi của người thứ hai tại thời điểm đó một lần. Lặp lại việc loang  đó cho đến khi không thể loang được tiếp hoặc kiểm tra thấy 2 người gặp nhau (tức cả 2 bên loang cùng đến được một địa điểm) hoặc kiểm tra thấy một đỉnh nào đó lặp lại quá nhiều một số lần cho phép (tức người đó rơi vào một chu trình mà không thể gặp được người kia) hay nếu queue vơi giới hạn cao cũng không thể chứa được nữa.

    Giả mã

    While Not Stop Do
       Begin
       Loangr1(đau1, cuoi1, Stop1);
       Loangr2(đau2,cuoi2, Stop2);
       If  kiemtra (dau1, cuoi1, dau2, cuoi2) then begin found := true; break end;
       Stop := Stop 1 or Stop2;
    End;

    Trong chương trình con Loangr1(dau1, cuoi1, Stop1) đó biến stop1 trả giá trị true nếu chưa vượt quá giới hạn queue1solanlaplai[i] < Ghanchophep (co the là 10000 – tuy theo ban thich đo chinh xac nao).

    Hàm Loangr2(đau2,cuoi2, Stop2) cũng tương tự.

    Hàm Kiemtra (dau1, cuoi1, dau2, cuoi2) tra gia tri true nếu với các đỉnh được đi đến (vừa kết nạp vào queue1 và queue 2) trong lần loangr1 (co cuoi1 – dau1 đỉnh) và trong lần loangr2 (có cuoi2 – dau2 đỉnh) có một đỉnh chung.

    2. Bài tập HSG Tin học THPT: Trư bát giới

    Trên đường đi thỉnh kinh, một lần Bát Giới được Tôn Ngộ Không giao cho nhiệm vụ đi hầu Tam Tạng. Tam Tạng đi với tốc độ không đổi và đường đi của ông là đường gấp khúc (có thể tự cắt) gồm n điểm gãy. Mỗi điểm gãy được cho bởi cặp số nguyên (xi, yi) là toạ độ trên mặt phẳng xoy. Theo hầu Tam Tạng, Bát Giới đi chơi theo con đường riêng của mình nhưng luôn gặp Tam Tạng tại n điểm gãy nói trên. Hai người bắt đầu xuất phát từ điểm (x1, y1) và kết thúc chuyến đi đồng thời tại điểm (xn, yn) để chờ Tôn Ngộ Không và Sa Tăng. Bát Giới có thể đi với tốc độ không vượt quá hai lần tốc độ của Tam Tạng. Khi Tam Tạng đi theo đường thẳng từ điểm gãy này đến điểm gãy kế tiếp, Bát Giới có thể chạy đến các điểm hấp dẫn được cho bởi m cặp số nguyên (x’i, y’i). Tuy nhiên, sau khi tách rời Sư phụ tại điểm (xi, yi) Bát Giới chỉ có thể thăm không quá một điểm hấp dẫn ông để rồi gặp lại Sư phụ tại điểm (xi+1, yi+1).

    Yêu cầu:

    Tìm đường đi của Bát Giới thoả mãn các điều kiện nêu trên và sao cho số điểm hấp dẫn của Bát Giới thăm được là nhiều nhất.

    Dữ liệu: Bg.inp.

    • Dòng đầu tiên chứa hai số nguyên dương n và m (2n100, 0m100)
    • Dòng thứ hai chứa n cặp số nguyên: x1, y1, …, xn, yn.
    • Dòng thứ ba chứa m cặp số nguyên: x’1, y’1, …, x’m, y’m.

    Các điểm trong file dữ liệu là khác nhau từng đôi một và toạ độ của chúng là các số nguyên có trị tuyệt đối không vượt quá 1000. Các số ghi cách nhau bởi dấu cách.

    Kết quả: Bg.out.

    • Dòng đầu tiên ghi số nguyên dương k là số điểm gãy trên đường đi của Bát Giới.
    • Dòng thứ hai ghi cặp toạ độ u1, v1, …, uk, vk biểu diễn đường đi của Bát Giới. Các toạ độ ghi cách nhau bởi dấu cách..

    Ví dụ:

    Bg.INP Bg.OUT
    4 5

    1 4 5 7 5 2 -2 4

    -4 -2 3 9 1 2 -1 3 8 -3

    6

    1 4 3 9 5 7 5 2 1 2 -2 4

    Hướng dẫn:

    Dùng cặp ghép

    • Xây dựng tập X: tập các gồm n – 1 phần tử. Với các phần tử đó là các cạnh trên đường đi của Bát Giới.
    • Xây dựng tập Y: tập gồm m phần tử. Các phần tử là các điểm hấp dẫn.
    • Xây dựng ma trận quan hệ giữa X và Y. Nếu ở phần tử i (i của tập X – tức là các cạnh trên đường đi của Tam Tạng), Bát Giới có thể đi đến điểm hấp dẫn j (j thuộc Y) thì a[i,j] = true và ngược lại. Tức là a[i,j] = true ó kc(xi, yi, x’j, y’j) + kc(xi+1, yi+1, x’j, y’j) 2kc(xi, yi, xi+1, yi+1).
    • Dùng thuật toán cặp ghép tối đa để giải.

    3. Bài tập HSG Tin học THPT: Bàn cờ 4 * 4

    Một bàn cờ có dạng bảng vuông kích thước 4 * 4, trên đó có một số quân cờ. Một quân cờ chỉ có thể di chuyển sang 1 ô kề cạnh còn trống, mỗi di chuyển như vậy được gọi là 1 bước di chuyển. Cho hai trạng thái của bàn cờ, hãy chỉ ra một dãy các bước di chuyển để đưa bảng từ trạng thái xuất phát đến trạng thái đích với số phép di chuyển là ít nhất. Mỗi trạng thái được mô tả là một ma trận 4 * 4 trong đó số ô ở hàng I, cột j là 1 nếu tại vị trí (i,j) tương ứng có quân cờ đang đứng hoặc bằng 0 nếu không có.

    Dữ liệu: chess.inp

    • Gồm 2 * 4 dòng thể hiện ma trận mô tả trạng thái xuất phát và trạng thái đích. 4 dòng đầu tiên thể hiện ma trận xuất phát, 4 dòng tiếp theo là ma trận đích.
    • Input luôn đảm bảo là có nghiệm.

    Kết quả: chess.out

    • Dòng đầu tiên ghi k là số ít nhất các phép biến đổi tìm được.
    • K dòng tiếp, mỗi dòng mô tả 1 phép biến đổi, theo đúng trình tự biến đổi, gồm 4 số nguyên dương u, v, x, y thể hiện di chuyển quân cờ ở vị trí (u, v) sang vị trí (x, y).

    Ví dụ:

    Chess.inp Chess.out
    1111

    1111

    0000

    0000

    0000

    0000

    1111

    1111

    16

    2 1 3 1

    1 1 2 1

    2 2 3 2

    1 2 2 2

    2 3 3 3

    1 3 2 3

    2 4 3 4

    1 4 2 4

    3 1 4 1

    2 1 3 1

    3 2 4 2

    2 2 3 2

    3 3 4 3

    2 3 3 3

    3 4 4 4

    2 4 3 4

    4. Bài tập HSG Tin học THPT: Đội cờ             

    Có hai đội cờ vua A và B thi đấu với nhau. Mỗi đội cử ra n kì thủ, mỗi kì thủ của đội B chỉ đấu một trận và đấu với 1 kì thủ của đội A và ngược lại. Vậy có tất cả n trận đấu. Đội nào thắng được 2 điểm, hoà được 1 điểm và thua không được điểm nào.

    Cho đội B được quyền chọn cặp thi đấu.

    Yêu cầu: lập trình để đội B chọn được các cặp thi đấu sao cho tổng số điểm của đội B là cao nhất. Cho biết trình độ của kì thủ thứ i của hai đội A và B là ai và bi (I = 1, 2, …, n) và giả sử trong thi đấu, hai kì thủ có trình độ bằng nhau sẽ hoà và cầu thủ nào có trình độ cao hơn sẽ thắng.

    Dữ liệu: Doico.inp

    • Dòng đầu ghi số nguyên dương n (1n10000).
    • Trên dòng thứ I trong số n dòng tiếp theo ghi hai số nguyên dương ai, bi (1ai, bi1000), cách nhau một khoảng trắng.

    Kết quả: Doico.out

    • Dòng đầu là số nguyên t là tổng số điểm cao nhất mà đội B có thể đạt được.
    • Trên dòng thứ hai là n số nguyên dương xi, trong đó xi là số thứ tự của kì thủ đội B phải đấu với kì thủ thứ i của đội A để tổng số điểm đội B đạt được là lớn nhất.

    Ví dụ:

    Doico.inp Doico.out
    4

    7 8

    5 6

    4 3

    9 4

    5

    1 2 4 3

    Hướng dẫn thuật giải:

    • Sắp xếp hai mảng A, B theo thứ tự không giảm, nhớ lưu vị trí cũ của A, B vào hai mảng chỉ số.
    • Ta thực hiện phương pháp tối ưu từng bước, cụ thể:
    • Ở chương trình này cần chú ý khi sắp xếp 2 dãy A, B thì vị trí các kì thủ đã đổi, do đó mảng x là mảng ứng với vị trí mới của mảng A và B ta cần đổi về vị trí cũ.

    5. Bài tập HSG Tin học THPT: Hệ thống xe buýt.

    Một hệ thống các xe buýt có nhiệm vụ chuyên chở hành khách đi lại giữa một số ga sao cho đảm bảo tính liên thông hai chiều giữa các ga này. Hệ thống bao gồm một số tuyến đường, mỗi tuyến đường gồm một số ga khác nhau theo thứ tự mà xe buýt đi qua. Xe buýt thuộc tuyến đường nào chỉ chạy trên tuyến đường đó, lần lượt qua các ga thuộc tuyến cho đến hết, sau đó lại quay đầu chạy theo hướng ngược lại. Có thể có một số ga chung cho một số tuyến đường. Một hành khách muốn đi từ ga đầu đến ga cuối, có thể đi trên một tuyến hoặc phải chuyển tuyến một số lần ở những nơi có ga chung. Bài toán đặt ra là, cần tìm một hành trình cho phép đi từ ga đầu đến ga cuối sao cho số lần phải chuyển tuyến là ít nhất. Nếu tồn tại nhiều phương án như vậy, hãy tìm phương án đi qua ít ga nhất.

    Dữ liệu: busway.inp

    • Dòng đầu là số tuyến đường.
    • Các dòng tiếp mỗi dòng mô tả một tuyến đường, gồm một chuỗi các kí tự viết liền nhau, mỗi kí tự mô tả một tên ga theo đúng thứ tự các ga tren tuyến (chú ý các ga trên cùng một tuyến là khác nhau, nhưng các ga trên các tuyến khác nhau có thể trùng nhau, tên ga có thể là một kí tự bất kì hiển thị được trong bảng mã ACSII)
    • Dòng tiếp theo là số hành trình cần tìm.
    • Các dòng tiếp theo, mỗi dòng mô tả một hành trình cần tìm, gồm cặp kí tự viết liền nhau, xác định các tên ga đầu và ga cuối.

    Giả thiết các dữ liệu là hợp lệ, không cần kiểm tra. Giới hạn kích thước 100 cho số các tuyên đường và 50 cho số các ga trên cùng một tuyến đường.

    Kết quả: busway.out

    • Mỗi hành trình được viết trên một dòng, gồm các kí tự biểu diễn tên ga viết theo thứ tự đi được. Các tên ga này được viết thành từng nhóm theo tuyến đường: nếu thuộc cùng một tuyến thì viết liền nhau, nếu sang tuyến khác thì viết cách nhau một dấu cách (space), tên ga chung được viết lặp lại.

    Ví dụ

    Busway.inp Busway.out
    3

    ABC

    DBE

    GAEH

    2

    HC

    GB

    HEA ABC

    GA AB

    Hướng dẫn:

    • Xây dựng đồ thị đường đi giữa các ga là ma trận hai chiều (lưu vào mảng trọng số a). Coi mỗi kí tự là một đỉnh của đồ thị (dùng hàm ord(kítự) lấy giá trị là số). a[i,j] = 0 nếu các kí tự “chr(i)”, “ chr(j)” (cũng là các ga) không thuộc cùng một tuyến đường nào cả. a[i,j] > 0 và là giá trị nhỏ nhất của đoạn đường đi giữa hai ga (chr(i), chr(j)).
    • Dùng thuật toán Dijstra để tìm đường đi ngắn nhất từ ga đầu tới ga cuối. Trong thuật toán ta có hai ưu tiên sau:
      • Số ga giữa đường đi là ít nhất (ưu tiên cao nhất).
      • Tổng đường đi giữa các ga là nhỏ nhất.
    • Với ưu tiên thứ nhất ta có thể coi đồ thị vừa lập là một đồ thị mới: đồ thị quan hệ: a[i,j] = 0 tức không có đường đi từ i tới j và a[i,j] > 0 tức có đường đi giữa i và j. Với ưu tiên thứ nhất ta coi a[i,j] > 0 thì a[i,j] = 1 trong đồ thị mới lập.
    • Khi ưu tiên thứ nhất được thoả mãn ta xét đến ưu tiên thứ hai, khi đó coi như thuật toán Dijstra dùng cho đồ thị cũ đã lập lúc đầu – đồ thị trọng số.

    6. Bài tập HSG Tin học THPT: Bố trí phòng họp.

    Có n cuộc họp được đánh số từ 1 đến n đăng kí làm việc tại một phòng hội thảo. Cuộc họp i cần bắt đầu vào thời điểm ai và kết thúc vào thời điểm bi (i = 1..n). Hai cuộc họp có thể nhận phục vụ nếu các khoảng thời gian làm việc tương ứng chỉ có thể giao nhau tại đầu mút hoặc tách rời nhau.

    Yêu cầu: Hãy tìm một lịch cho phòng hội thảo để có thể phục vụ nhiều cuộc họp nhất.

    Dữ liệu:  Activity.inp.

    • Dòng đầu tiên là giá trị n (n <= 1000000).
    • Dòng thứ i trong n dòng tiếp theo ghi 2 số ai và bi cách nhau ít nhất một dấu cách. (ai, bi <=32000 và là các số nguyên dương).

    Kết quả: Activity.out.

    • Dòng đầu tiên ghi số k là số cuộc họp tối đa có thể bố trí.
    • Dòng tiếp theo ghi số hiệu của cuộc họp được phục vụ theo trình tự lịch bố trí.

    Ví dụ:

    Activity.inp Activity.out
    5

    1 3

    2 4

    1 6

    3 5

    7 9

    3

    1 4 5

    Hướng dẫn:

    Do n lớn nên ta cần lưu dữ liệu theo mảng thời gian.

    Khai báo:        tr: array [1..32000] of integer;

    Dùng mảng trước đánh dấu thời gian cuối của cuộc họp. Tức là nếu tr[c]  <> 0 thì tồn tại cuộc họp có thời điểm kết thúc là c và tr[c] mang ý nghĩa là thời điểm ban đầu của cuộc họp. Đọc dữ liệu và đánh dấu mảng tr sao cho tr[c] gần c nhất có thể.

    Với cuộc họp có thời điểm kết thúc c mà ta chọn, ta cần lưu chỉ số của cuộc họp đó.

    Khai báo:        Cs: array [1..32000] of longint; {vì n lớn}.

    Do mảng này không thể khai báo được -> lưu chỉ số theo 2 giá trị: n div 32, n mod 32 -> thay mảng cs bằng hai mảng sau:

    Khai báo:        Trx, try: array [1..32000] off integer

    Ý nghĩa  :        trx[c] = I div 32; try[c] := I mod 32.

    Mảng try có thể khai báo bằng kiểu byte. Hai mảng này dùng mảng động.

    Xử lí: Gọi max là thời gian kết thúc lớn nhất trong các cuộc họp. Duyệt từ 1 đến max, nếu có cuộc họp i nào có tr[i] >= cuối thì kết nạp vào mảng lưu. Với cuoi là giá trị thời gian kết thúc của cuộc họp được chọn trước đó (đầu tiên cuối = 0).

    7. Bài tập HSG Tin học THPT: Phân phối kênh

    Công ty dịch vụ mạng máy tính cần phân phối kênh hoạt động phục vụ n yêu cầu của khách hàng (n <= 5000) đánh số thứ tự từ 1 tới n. Với mỗi khách hàng thứ i ta biết khoảng thời gian yêu cầu sử dụng kênh là (si, ti), i =1, 2, …, n (khách hàng sẽ sử dụng kênh từ thời điểm si tới thời điểm ti). Thời gian chuyển giao kênh từ khách hàng này tới khách hàng khác là không đáng kể. Như vậy, nếu hai khách hàng nào đó được bố trí làm việc trên cùng một kênh thì các khoảng thời gian sử dụng của họ chỉ có thể có nhiều nhất là một điểm chung.

    Yêu cầu: hãy tìm cách phân phối sử dụng ít kênh nhất.

    Dữ liệu: Chanel.inp

    • Dòng đầu tiên ghi số n.
    • Dòng thứ i trong số n dòng tiếp theo mỗi dòng ghi 2 số nguyên dương si, ti (i =1, 2, …, n).

    Kết quả: Chanel.out

    • Dòng đầu tiên ghi số lượng kênh cần sử dụng p.
    • Mỗi dòng thứ i trong số p dòng tiếp theo chứa các chỉ số của mỗi khách hàng sử dụng kênh thứ i, i = 1, 2, …, p.

    Ví dụ:

    Chanel.inp Chanel.out
    7

    0 3

    3 5

    6 8

    0 7

    7 8

    0 2

    2 6

    3

    4 5

    1 2 3

    6 7

    Hướng dẫn.

    Ở bài này ta cần xác định các khách hàng với khoảng thời gian (si, ti) đó vào các tập sao cho các khoảng thời gian trong mỗi tập chỉ có thể có duy nhất là một điểm chung và số tập là ít nhất có thể được. Ta sắp xếp lại các khoảng thời gian đó theo thứ tự tăng dần của si, nếu si, sj bằng nhau thì sắp xếp theo thứ tự tăng dần của ti, tj … Khi đó ta duyệt các khách hàng theo thứ tự từ 1 tới n, với mỗi khách hàng thì ta duyệt các tập đã xây dựng được, nếu có thể kết nạp khách hàng này vào tập hợp nào thì ta kết nạp vào (và có thể thấy đó là cách kết nạp tối ưu do hiệu quả của sắp xếp), nếu không thì cho khách hàng này vào tập hợp mới. Ta thấy độ phức tạp của thuật toán chỉ cỡ .

    8. Bài tập HSG Tin học THPT: Trò chơi với ô chữ.

    Tiếp tục phát triển trò chơi với ô chữ, người ta đã đánh số cho các từ có độ dài từ 1 đến 26 theo quy tắc là ưu tiên độ dài từ, sau đó là theo vần ABC. Với:

    a                      1

    b                      2

    z                      26

    aa                    27

    snowfall          157.118.051.752

    Như vậy, mỗi một số ta có tương ứng là một từ gồm các chữ cái thường và ngược lại ứng với mỗi từ ta có một số tương ứng. Công việc đặt ra là: giả sử ta có một số hãy tìm từ tương ứng với nó, và cho một từ hãy cho biết từ đó ứng với số bao nhiêu.

    Dữ liệu: Game.inp.

    • Dòng đầu là một số nguyên.
    • Dòng thứ hai là một xâu kí tự (gồm các kí tự thường).

    Kết quả: Game.out.

    • Dòng thứ nhất là một từ tương ứng với số trong file input.
    • Dòng thứ hai là một số tương ứng với từ trong file input.

    Ví dụ:

    Game.inp Game.out
    157118051752

    snowfall

    snowfall

    157118051752

    9. Bài tập HSG Tin học THPT: Công việc

    Có n công viêc đánh số từ 1 đến n, n <= 10000. Mỗi việc làm đều phải làm liên tục trong một giờ mới xong. Việc u nếu làm không muộn hơn giờ thứ du sẽ thu được một giá trị nguyên dương gu; các giá trị du, gu nguyên dương và không lớn hơn 60000. Tại mỗi thời điểm không được làm hơn một việc và bắt đầu từ thời điểm 0, giờ thứ I xem như bắt đầu từ thời điểm I – 1.

    Yêu cầu: Hãy chọn một số việc làm sao cho tổng giá trị thu được là lớn nhất. Các số phát sinh trong phạm vi longint.

    Dữ liệu: Job.inp

    • Dòng thứ nhất ghi số n.
    • N dòng tiếp theo, dòng thứ u ghi hai số du, gu.

    Kết quả: Job.out

    • Dòng thứ nhất ghi tổng giá trị thu được.
    • Tiếp theo là các dòng, mỗi dòng ghi hai số x, y với ý nghĩa việc x làm trong giờ thứ y.

    Ví dụ:

    Job.inp Job.out
    6

    3 7

    3 20

    1 10

    1 15

    1 5

    3 3

    42

    3

    2 3

    4 1

    1 2

    10. Bài tập HSG Tin học THPT: Mã hoá Burrows wheeler.

    Burrows Wheeler đề xuất phương pháp mã hóa thông tin như sau: ví dụ cần mã hóa BANANA, các bước tiến hành là:

    • Bước 1: Từ cần mã hóa được dịch chuyển vòng tròn và tạo thành một ma trận l * l kí tự, trong đó l là độ dài của từ.
    • Bước 2: Sắp xếp lại các dòng của ma trận theo thứ tự từ điển.
    • Bước 3: trích xâu từ các kí tự cuối của cột, thông báo xâu này và cho biết từ gốc là thứ mấy trong ma trận nhận được ở bước 2. Ta có: (NNBAAA, 4).

    BANANA                               ABANAN

    ANANAB                               ANABAN

    NANABA                               ANANAB

    ANABAN                               BANANA

    NABANA                               NABANA

    ABANAN                               NANABA.

    Yêu cầu: cho kết quả mã hóa (kết quả bước 3). Hãy xác định từ ban đầu.

    Dữ liệu: mahoa.inp:

    • Bao gồm một hoặc nhiều nhóm 2 dòng , dòng đầu là xâu kí tự độ dài không quá 100, dòng sau là số nguyên dương cho biết vị trí từ gốc.

    Kết quả: mahoa.out:

    • Xuất ra các từ ban đầu, mỗi từ trên 1 dòng.

    Ví dụ:

    Mahoa.inp Mahoa.out
    NNBAAA

    4

    OMOEULCG

    1

    BANANA

    COGUMELO

    11. Bài tập HSG Tin học THPT: Mặt phẳng

    Trên mặt phẳng cho n hình chữ nhật có cạnh song song với trục toạ độ. Hãy đếm số miền mặt phẳng được tạo ra bởi các cạch của hình chữ nhật. Một miền mặt phẳng là một vùng liên tục khép kín giới hạn bởi các cạnh của hình chữ nhật và không chứa một miền mặt phẳng nào khác.

    Dữ liệu: Matphang.inp.

    Dòng đầu là số nguyên dương n (<30) là số hình chữ nhật.

    N dòng tiếp theo, mỗi dòng chứa 4 số nguyên dương lần lượt là toạ độ theo hai trục toạ độ của hai đỉnh đối của hình chữ nhật.

    Kết quả: Matphang.out.

    Số miền mặt phẳng tìm được.

    Ví dụ:

    Matphang.inp Matphang.out
    2

    10 10 30 30

    20 20 40 40

    3

     

    Matphang.inp Matphang.out
    2

    20 10 30 40

    10 20 40 30

    5

    12. Bài tập HSG Tin học THPT: Truyền tin ngắn nhất.

    Trong một mạng gồm n máy tính đánh số từ 1 đến n. Sơ đồ nối mạng được cho bởi hệ thống gồm m kênh nối trực tiếp giữa một số cặp máy trong mạng. Biết chi phí truyền cho 1 đơn vị thông tin theo mỗi kênh nối của mạng.

    Người ta cần chuyển 1 bức thông điệp từ máy s -> t. Để đảm bảo an ninh, người ta muốn chuyển bức thông điệp này theo 2 đường truyền tin khác nhau (tức là không có kênh nào của mạng được sử dụng trong cả 2 đường truyền tin). Chi phí của 1 đường truyền được hiểu là tổng chi phí trên các kênh của nó.

    Yêu cầu: giả sử bức thông điệp có độ dài một đơn vị thông tin, hãy tìm cách chuyển thông điệp từ s -> t sao cho tổng chi phí chuyển thông tin ( bằng tổng chi phí theo cả hai đường truyền tin) là nhỏ nhất.

    Dữ liệu: May.inp

    • Dòng đầu ghi n, m, s, t cách nhau bởi dấu cách (n<=100).
    • Mỗi dòng thứ i trong số m dòng tiếp theo ghi thông tin về kênh nối thứ i của mạng gồm 3 số di, ci, gi: di, ci là chỉ số 2 máy tương ứng và gi là chi phí để truyền theo kênh này (đường truyền là hai chiều).

    Kết quả: May.out

    • Dòng đầu ghi tổng chi phí.
    • Dòng thứ hai ghi đường truyền 1: s-> t.
    • Dòng thứ ba ghi đường truyền 2: s ->t.

    Ví dụ:

    May.inp May.out
    5 7 15

    1 2 3

    1 4 8

    2 3 5

    2 4 4

    3 5 5

    4 3 8

    4 5 3

    24

    1 2 3 5

    1 4 5

    13. Bài tập HSG Tin học THPT: Robot quét vôi

    Có 9 căn phòng (đánh số từ 1 đến 9) đã được quét vôi với mầu trắng, xanh hoặc vàng. Có 9 rôbôt (đánh số từ 1 đến 9) phụ trách việc quét vôi các phòng. Mỗi rôbôt chỉ quét vôi một số phòng nhất định. Việc quét vôi được thực hiện nhờ một chương trình cài sẵn theo qui tắc:

    • nếu phòng đang có mầu trắng thì quét mầu xanh,
    • nếu phòng đang có mầu xanh thì quét mầu vàng,
    • nếu phòng đang có mầu vàng thì quét mầu trắng.

    Cần phải gọi lần lượt một số các rôbôt ra quét vôi (mỗi lần một rôbôt, một rôbôt có thể gọi nhiều lần và có thể có rôbôt không được gọi. Rôbôt được gọi sẽ quét vôi tất cả các phòng mà nó phụ trách) để cuối cùng các phòng đều có mầu trắng. Hãy tìm một phương án như vậy sao cho lượng vôi phải quét là ít nhất. Giả thiết rằng luợng vôi cho mỗi lượt quét đối với các phòng là như nhau.

    Dữ liệu: đọc từ file văn bản ROBOT.INP gồm các dòng:

    • 9 dòng đầu, mỗi dòng mô tả danh sách các phòng được quét vôi bởi một rôbôt theo thứ tự từ rôbôt 1 đến rôbôt 9. Mỗi dòng như vậy gồm các số hiệu phòng viết sát nhau. Chẳng hạn dòng thứ 2 có nội dung:
      3578 mô tả rôbôt 2 phụ trách việc quét vôi các phòng 3, 5, 7, 8.
    • dòng cuối mô tả mầu vôi ban đầu của các phòng. Dòng gồm 9 ký tự viết sát nhau, ký tự thứ i biểu diễn mầu vôi của phòng i với quy ước: ký tự T chỉ mầu trắng, ký tự X chỉ mầu xanh, ký tự V chỉ mầu vàng.

    Kết quả: đưa ra file văn bản ROBOT.OUT gồm một dòng dưới dạng:

    • nếu không có phương án thì ghi một chữ số 0,
    • trái lại ghi dãy thứ tự các rôbôt được gọi (các số hiệu rôbôt viết sát nhau).

    Thí dụ: 

    ROBOT.INP   ROBOT.OUT
    159

    123

    357

    147

    5

    369

    456

    789

    258

    XVXVXVTXT

    2455688

    14. Bài tập HSG Tin học THPT

    Cho 2 xâu:

    X = x1x2..xM. (Với xi là các kí tự số từ ‘0’ đến ‘9’)

    Y = y1y2..yN.( Với yi là các kí tự số từ ‘0’ đến ‘9’)

    (M, N <= 250)

    Ta gọi: Z = z1z2..zk là xâu chung của 2 xâu X, Y nếu xâu Z nhận đ­ợc từ xâu X bằng cách xoá đi một số kí tự và cũng nhận được từ xâu Y bằng cách xoá đi một số kí tự.

    Yêu cầu: Tìm một xâu chung của 2 xâu X, Y sao cho xâu nhận được tạo thành một số lớn nhất có thể được.

    Dữ liệu vào file: String.inp

    Gồm 2 dòng, dòng 1 là xâu X, dòng 2 là xâu Y.

    Kết quả ra file: String.out

    Gồm 1 dòng duy nhất là số lớn nhất có thể nhận được.

    Ví dụ:

    String.inp String.out
    19012304 034012 34

    15. Bài tập HSG Tin học THPT: Vườn Táo

    Trong một mảnh vờn hình vuông cạnh 1000 m có trồng N cây táo . Vị trí mỗi cây táo đợc xác định bởi toạ độ (x,y) trong hệ toạ độ vuông góc với gốc toạ đọ là góc trái dới của vờn và các trục toạ độ song song với các cạnh vờn . Hãy tìm hình chữ nhật lớn nhất sao cho các cạnh song song với các cạnh của vờn , và trong nó không chứa cây táo nào ( mà chỉ có thể chứa trên biên ) .

    Dữ Liệu vào từ file     Tao.Inp

    • Dòng thứ nhất ghi N số từ 1 đến 600 .
    • Trong N dòng sau mỗi dòng ghi hai số nguyên dơng x,y ,0<x,y<1000 là toạ độ của các cây táo .

    Kết Quả ghi ra file   Tao.Out

    • Dòng thứ nhất ghi diện tích hình chữ nhật
    • Dòngthứ hai ghi số hai số là toạ độ của đỉnh trái dới
    • Dòng thứ ba ghi hai số là toạ độ của đỉnh trên phải của hình chữ nhật .

    Ví Dụ:

    TAO.INP

    7 280 100 200 600 400 200 135 800 800 400 600 800 900 210

    TAO.OUT

    360000 200 200 800 800

    Hướng dẫn.

    Ta thêm vào tập các cây những cây giả là hình chiếu của các cây thật trên bốn cạnh của khu vờn . Sắp xếp lại các cây theo thứ tự tăng dần của hoành độ . Thực chất ta đã chia chúng thành các hình nhỏ hơn . Sau đó tìm từng hình một thoả mãn điều kiện của hình chữ nhật ( không chứa táo , diện tích lớn nhất ) .

    16. Bài tập HSG Tin học THPT Dãy lồi

    Dãy giá trị nguyên A=(a1, a2, …, an) được gọi là dãy lồi nếu nó giảm dần từ a1 tới ai nào đó, rồi tăng dần tới an. Ví dụ: dãy 10 5 4 2 -1 4 6 8 12 là dãy lồi.

    Yêu cầu: lập trình nhập vào một dãy số nguyên, bằng cách xoá bớt một số phần tử của dãy và giữ nguyên trình tự các phần tử còn lại, ta nhận được dãy con lồi dài nhất.

    Dữ liệu: dayloi.inp.

    • Dòng đầu là số tự nhiên n (n<=5000).
    • Dòng tiếp theo là n số nguyên của dãy số(các số kiểu integer).

    Kết quả: dayloi.out.

    • Dòng đầu tiên ghi số phần tử lớn nhất của dãy con tìm được (ghi ra 0 nếu không tồn tại dãy lồi).
    • Dòng tiếp theo ghi các số thuộc dãy con (không thay đổi trật tự các phần tử trong dãy ban đầu).

    Ví dụ:

    Dayloi.inp Dayloi.out
    10

    1 2 3 4 2 5 1 2 3 4

    6

    4 2 1 2 3 4

  • 100 ĐỀ THI HỌC SINH GIỎI TIN HỌC – ĐỀ THI TIN HỌC TRẺ

    100 ĐỀ THI HỌC SINH GIỎI TIN HỌC – ĐỀ THI TIN HỌC TRẺ

    Bài 1: Viết chương trình nhập vào tọa độ tâm I(a;b) và bán kính r của một đường tròn (a, b, r là các số nguyên). Sau đó nhập vào một điểm A(x, y) bất kì và kiểm tra xem nó có thuộc đường tròn hay không?

    Bài 2: Viết chương trình tính tích xy (với x, y là hai số thực có độ lớn tùy ý).

    Bài 3: Tìm tất cả các chữ số có ba chữ số, sao cho tổng các lập phương của các chữ số thì bằng chính số đó.

    Bài 4: Nhập 3 loại tiền và số tiền cần đổi. Hãy tìm tất cả các tổ hợp có được của 3 loại tiền trên cho số tiền vừa nhập.

    Bài 5: Viết chương trình giải bài toán cổ sau:

    Trăm trâu trăm cỏ
    Trâu đứng ăn năm
    Trâu nằm ăn ba
    Trâu già ba con một bó.

    Hỏi có bao nhiêu con mỗi loại?

    Bài 6: Lập tam giác PASCAL, dùng chương trình con.

    Bài 7: Viết các chương trình con  tính diện tích tam giác, tròn, vuông, chữ nhật trong một chương trình. Sau  đó hỏi chọn  một trong các phương án  tính diện  tích bằng  cách chọn trong bảng chọn lệnh sau:

    1. Không làm gì hết và trở về màn hình soạn thảo.
    2. Tính diện tích hình vuông
    3. Tính diện tích hình tròn
    4. Tính diện tích tam giác
    5. Tính diện tích hình chữ nhật

    Bài 8: Viết chương trình nhập vào một dãy số nguyên   có n phần tử. In ra màn hình phần tử nhỏ nhất, phần tử lớn nhất và giá trị trung bình của danh sách ra màn hình.

    Bài 9: Viết chương trình nhập vào một dãy số nguyên  có n phần tử.

    1. Đưa những phần tử lẻ ra đầu danh sách, những phần tử chẵn về cuối danh sách và in kết quả ra màn hình.
    2. Sắp xếp các phần tử lẻ đầu danh sách theo thứ tứ tăng dần, sắp xếp các phần tử chẵn cuối danh sách theo thứ tự giảm dần. In danh sách ra màn hình.

    Bài 10: Viết chương trình nhập vào một chuỗi kí tự, sau đó nhập vào một kí tự bất kì và đếm số lần của nó trong chuỗi đã nhập.

    Bài 11: Viết chương trình nhập vào một chuỗi ký tự. Kiểm tra xem nó có đối xứng hay không (Ví dụ: Chuỗi đối xứng RADAR, MADAM).

    Bài 12: Viết chương trình nhập vào họ tên của một người. Sau đó in chuỗi họ tên ra màn hình với các ký tự đầu đổi thành chữ hoa, toàn bộ chuỗi họ và tên đổi thành chữ hoa.

    Bài 13: Viết chương trình nhập vào một dãy số nguyên  có n phần tử.

    1. Sắp xếp dãy theo thứ tự tăng dần và in kết quả ra màn hình.
    2. Nhập vào một số x bất kì, đếm số lần xuất hiện của nó trong dãy trên.
    3. In ra màn hình số phần tử nhỏ hơn hoặc bằng x.
    4. In ra màn hình số phần tử lớn hơn x.

    Bài 14: Sử dụng lệnh lặp để tính tổng của 11 số hạng đầu tiên

    S = 100 + 105 + 110  +...

    Bài 15:  Tìm số P, biết rằng

    P/4 = 1 - 1/3   + 1/5 - 1/7  +...

    Với độ chính xác: |1/2n-1| < 10^-5

    Bài 16: Cho một dãy số nguyên A(i) với i=1,...N. Viết chương trình:

    1. Tính và in ra trung bình cộng cuả các số dương trong dãy.
    2. Đếm xem có bao nhiêu số chia hết cho 3.
    3. In ra vị trí các số bằng 0 (nếu có) trong dãy đã cho.

    Bài 17:  Viết chương trình tìm các số có 3 chữ số mà tổng lập phương các chữ số của nó bằng chính nó (các số Amstrong).

    Bài 18:  Nhập một số thực x rồi tính

    S = 1 + x/1! + x^2/2! + x^3/3! +...+ x^n/n!

    với độ chính xác | x^n/n! | < 10^-5.

    Bài 19:  Dãy Fibonaxi được định nghĩa như sau:

    A1=A2=1, An=A(n-1) + A(n-2) với n>=2.

    Hãy:

    1. Nhập một số n và in ra n số Fibonaxi đầu tiên.
    2. Nhập một số n và in ra các số Fibonaxi nhỏ hơn hoặc bằng n.

    Bài 20:  Cho một dãy số. Viết chương trình:

    1. Gom tất cả các số chia hết cho 7 về đầu dãy và tất cả các số chia hết cho 5 vể cuối dãy.
    2. Sắp xếp phần số đã gom theo thứ tự tăng dần.

    Bài 21:   Cho một dãy số. Hãy viết chương trình Tìm phần tử nhỏ nhất và phần tử nhỏ thứ hai. Hãy cho biết vị trí đầu tiên của phần tử lớn nhất.

    Bài 22: Cho một dãy ký tự. Hãy viết chương trình tách dãy trên thành hai nửa, nửa đầu gồm các số, nửa sau là các chữ cái. Sắp xếp nửa đầu giảm dần, nửa sau tăng dần.

    Bài 23: Xét dãy các xâu F1, F2,... Fn trong đó:

    F1 = 'A'; F2 = 'B'; Fk+1 = Fk + F(k-1) với k=>2

    Ví dụ:

    F1 = 'A'
    F2 = 'B'
    F3 = 'BA'
    F4 = 'BAB'
    F5 = 'BABBA'
    F6 = 'BABBABAB'...

    Cho xâu S độ dài không quá 25, chỉ bao gồm các kí tự 'A''B'. Yêu cầu:

    1. Hãy xác định số lần xuất hiện xâu S trong xâu Fn, n<=35. Chú ý: Hai lần xuất hiện của S trong Fn không nhất thiết phải là các xâu rời nhau hoàn toàn.
    2. Dữ liệu vào: Đọc từ file văn bản FIBISTR.INP có cấu trúc như sau: Gồm nhiều dòng, mỗi dòng gồm nS. Giữa nS có đúng 1 dấu cách. Dữ liệu vào là chuẩn, không cần kiểm tra.
    3. Dữ liệu ra: Ghi ra file văn bản FIBISTR.OUT có cấu trúc như sau: Gồm nhiều dòng, mỗi dòng dữ liệu ứng với một dòng kết quả ra.

    Bài 24: SỐ PHẢN NGUYÊN TỐ. Một số tự nhiên n được gọi là số phản nguyên tố nếu nó có nhiều ước số nhất trong n số tự nhiên đầu tiên.

    Yêu cầu: Cho số K không vượt quá 10000. Ghi ra số phản nguyên tố lớn nhất nhỏ hơn hoặc bằng K.

    Dữ liệu vào: Đọc từ file văn bản OPNT.INP có cấu trúc như sau:

    • Dòng đầu tiên là số M (1<M<=100) là số lượng các số cần tìm số phản nguyên tố lớn nhất của nó.
    • M dòng tiếp theo là các số K1,K2,..KM

    Dữ liệu ra: Ghi ra file văn bản SOPNT.OUT có cấu trúc như sau:

    • Gồm M dòng.
    • Dòng thứ i (1<=i<=M) là số phản nguyên tố lớn nhất nhỏ hơn hoặc bằng Ki.

    Bài 25: Ngồi nhà quá rỗi, Sơn có ý tưởng dùng các que diêm tạo thành các số hập phân. Một cách đại diện cho 10 chữ số thập phân như sau:

    ĐỀ THI HỌC SINH GIỎI TIN HỌC - ĐỀ THI TIN HỌC TRẺ

    Cho N que diêm, Sơn có thể tạo ra một loạt các chữ số. Sơn kinh gạc phát hiện ra số nhỏ nhất và lớn nhất trong số đó có thể tạo được bằng cách sử dụng tất cả các que diêm của Sơn.

    Yêu cầu: Xác định số nhỏ nhất và lớn nhất mà Sơn có thể tạo ra.

    Dữ liệu vào: Đọc từ file văn bản MATCH.INP có cấu trúc như sau:

    • Dòng đầu tiên là số test K (1<K<=100)
    • K dòng tiếp theo, mỗi test gồm một dòng chứa số nguyên n (2<=n<=100) là số que diêm

    Bài 26: Dãy số được gọi là dãy số đối xứng nếu đọc các phần tử của dãy số này từ trái sang phải hay đọc ngược lại đều được cùng kết quả. Ví dụ: 1, 2, 1 hoặc 1, 2, 2, 1 là các dãy số đối xứng.

    Dãy số P được gọi là dãy số con của dãy số A nếu các phần tử thuộc P có mặt liên tiếp trong dãy số A với thứ tự không đổi. Ví dụ: 2, 1, 3 là dãy số con của 1, 2, 2, 1, 3.

    Cho dãy số tự nhiên A gồm n phần tử a1, a2, a3…an (ai <35000, 5<n<100)

    Yêu cầu: Hãy viết phương trình tìm dãy số P là dãy số con đối xứng dài nhất của dãy số A.

    Dữ liệu vào: Nhập vào số tự nhiên n và n phần tử của dãy số A.

    Kết quả: Xuất ra màn hình kết quả vừa tìm được

    Ví dụ:

    Dữ liệu vào: (nhập từ bàn phím)

    N=5   1 2 2 1

    Kết quả: (xuất ra màn hình)

    A: 1 2 2 1 2

    Bài 27:   Xâu s1 có độ dài m và s2 có độ dài n ( m,n là hai số tự nhiên; n,m<250). Biết rằng s1,s2 chỉ chứa các kí tự ‘A’…’Z’.

    Yêu cầu: Hãy viết phương trình tìm xâu con chung dài nhất của xâu s1 và s2.

    Dữ liệu vào: Nhập từ bàn phím 2 xâu s1 và s2.

    Kết quả: Xuất ra màn hình xâu con chung của 2 xâ s1 và s2.

    Ví dụ:

    Dữ liệu vào: kết quả: ABBA

    S1:ABBABC

    S2:ABABBA

    Bài 28: Cho xâu S có độ dài N (N<100). Xâu S chỉ chứa các k‎ tự số ‘0’…’9’.

    Yêu cầu: Hãy viết chương trình tìm xâu S1 bằng cách hoán vị các k‎ tự số trong xâu S sao cho xâu S1 có giá trị nhỏ nhất lớn hơn S.

    Đữ liệu vào: Cho trong tệp tin so.inp, gồm 1 dòng ghi xâu S.

    Kết quả: Ghi trong tập tin so.out, gồm 1 dòng ghi kết quả vừa tìm được.

    Ví dụ:

    Dữ liệu vào: (So.inp)     Kết quả: (so.out)

    ‘1234’   ‘1324’

    Bài 29: Viết chương tìm ước số chung lớn nhất của hai số nguyên a và b khác 0, với a, b được nhập từ bàn phím.

    Bài 30:  Viết chương trình nhập vào một mảng gồm n phần tử (n<=100). Kiểm tra và in ra màn hình các số là số nguyên tố sắp xếp theo thứ tự tăng dần.

    Bài 31: Cho số tự nhiên N (N<=50). Hãy viết chương trình thực hiện:

    1. Nhập số N, sau đó nhập N số nguyên từ bàn phím. thứ tự của các số gọi là chỉ số.
    2. Hãy tính trong dãy số trên có bào nhiêu số dương chẵn.
    3. Tìm (các) chỉ số của giá trị âm lớn nhất của dãy số nếu có.
    4. Tìm tất cả các dãy con dài nhất các số khác không cùng dấu.

    Bài 32:  Nhập vào từ bàn phím một số N nguyên dương (N<=5000).

    1. Hãy phân tích N thành tổng của hai số nguyên tố (nếu được) và thông báo không được nếu không có phương án nào.
    2. Nếu N thoả mãn câu a, hãy đưa càng nhiều càng tốt các phương án phân tích (2 phương án có cùng các số hạng chỉ coi là một)

    Bài 33:  Cho trước một dãy số bao gồm toàn các số 0 và 1. Dãy này có độ dài nhỏ hơn 255.

    1. Viết chương trình nhập dãy số trên từ bàn phím. Các số được nhập liên tiếp từ bàn phím, quá trình nhập dữ liệu kết thúc nhấn phím <Enter>. Nếu việc nhập dữ liệu sai trên màn hình kết quả “Bạn đã nhập sai, đề nghị nhập lại” và cho phép nhập lại ngay dữ liệu.
    2. Một dãy con đúng của dãy trên được gọi là một dãy con liên tục bất kỳ của dãy trên bao gồm các số hạng giống nhau. Hãy tính độ dài lớn nhất của một dãy con đúng của dãy trên.
    3. Một dãy con đúng bậc 1 của dãy trên được coi là một dãy con liên tục bất kỳ của dãy trên bao gồm toàn các số hạng giống nhau ngoại trừ 1 phần tử. Hãy tính độ dài lớn nhất của một dãy con đúng bậc 1 của dãy trên.

    Bài 34:  Cho số nguyên N trong phạm vi từ 1000 đến 999999. Cần xác định số này có phải là thông tin về một ngày tháng có trong thế kỷ 21 không. (Thế kỷ 21 bắt đầu từ 1 tháng 1 năm 2001 và kết thúc vào ngày 31 tháng 12 năm 3000. Biết rằng 2  chữ số cuối của N là chỉ hai chữ số cuối của năm, các chữ số còn lại (ở đầu) xác định ngày và tháng.

    Ví dụ:

    1111       tương ứng với 1 tháng 1 năm 2011;

    21290     tương ứng với 2 tháng 12 năm 2090 hoặc 21 tháng 2 năm 2090;

    131192 tương ứng với 13 tháng 11 năm 2092;

    32392     Không phải là thông tin về một ngày tháng nào cả;

    311198 Không phải là thông tin về một ngày tháng nào cả;

    29205     Không phải là thông tin về một ngày tháng nào cả;

    Dữ liệu: Nhập vào số N từ bàn phím.

    Kết quả: Đưa ra màn hình các ngày tháng năm tương ứng với N hoặc thông báo là KHONG nếu N không phải là thông tin về một ngày tháng nào cả.

    Ví dụ:

    Giá trị của N Thông báo ra màn hình tương ứng
    1111

    21290

    29205

    1-1-2011

    2-12-2090 HOAC 21-2-2090

    KHONG

    Bài 35:    Cho dãy số nguyên a1, a2,…, an (n <= 1000).

    Hãy tìm cách thực hiện một số ít nhất phép đổi chỗ hai số hạng bất kỳ của dãy để thu được dãy số mà số lẻ đứng ở vị trí lẻ, số chẵn đứng ở vị trí chẵn.

    Dữ liệu: Vào từ file văn bản DAYSO.INP:

    • Dòng đầu tiên chứa số nguyên dương n;
    • Dòng thứ i trong số n dòng tiếp theo chứa số hạng ai của dãy đã cho (-32767 à 32767, i = 1, 2,…, n).

    Kết quả: ghi ra file văn bản DAYSO.OUT:

    • Dòng đầu tiên ghi số lượng phép đổi chỗ cần thực hiện k (qui ước k = -1, nếu không thể biến đổi được dãy đã cho thành dãy thoả mãn yêu cầu đầu bài);
    • Nếu k > 0, thì dòng thứ j trong số k dòng tiếp theo ghi chỉ số của hai số hạng cần đổi chỗ cho nhau ở lần đổi chỗ thứ j  ( j =1, 2,…, k).

    Ví dụ:

     DAYSO.INP DAYSO.OUT DAYSO.INP DAYSO.OUT
    6

    1

    2

    3

    4

    6

    5

    1

    5 6

    4

    1

    3

    2

    5

    -1

    Bài 36:  Một nhóm gồm n bạn học sinh của một lớp tham gia một câu lạc bộ tin học vào dịp nghỉ hè. Biết rằng khoảng thời gian mà bạn thứ i có mặt tại câu lạc bộ là [ai, bi] (ai<bi tương ứng là các thời điểm đến và rời khỏi câu lạc bộ). Cô giáo chủ nhiệm lớp muốn tới thăm các bạn trong nhóm này. Hãy giúp cô giáo chủ nhiệm xác định thời điểm đến câu lạc bộ sao cho tại thời điểm đó cô giáo có thể gặp được nhiều bạn trong nhóm nhất.

    Dữ liệu: Vào từ file văn bản MEETING.INP:

    • Dòng đầu tiên ghi số nguyên dương n (n <= 1000);
    • Dòng thứ i trong số n dòng tiếp theo ghi 2 số nguyên không âm ai, bi, i = 1, 2,…, n.

    Kết quả: Ghi ra file văn bản MEETING.OUT:

    • Dòng đầu tiên ghi số nguyên dương k là số lượng bạn đang có mặt ở câu lạc bộ tại thời điểm cô giáo đến;
    • Trong k dòng tiếp theo ghi chỉ số của k bạn có mặt ở câu lạc bộ tại thời điểm cô giáo đến, mỗi dòng ghi một chỉ số của một bạn.

    Ví dụ:

     MEETING.INP MEETING.OUT MEETING.INP MEETING.OUT
    6

    1  2

    2  3

    2  5

    5  7

    6  7

    9 11

    3

    1

    2

    3

    5

    1 2

    3 5

    7 9

    11 15

    17 21

    1

    1

    Bài 37:  Ứng với mỗi số tự nhiên x, ta có số tự nhiên f(x) bằng tổng bình phương các chữ số của x. Từ x ta xây dựng dãy (Xn) như sau:

    X1 = x ; X2 = f(X1) ; X3 = f(X2) ; …; Xi = f(Xi – 1)    với   1 <= I <= n

    Ví dụ:

    x = 12 ta có dãy: 12; 5; 25; 29; 85; 89; 145; 42; 20; 4; 16; 37; 58; 89

    x = 4 ta có dãy: 4; 16; 37; 58; 89; 145; 42; 20; 4

    Viết chương trình nhập vào từ bàn phím số tự nhiên x và in ra màn hình dãy (Xn)

    Dữ liệu vào: Số tự nhiên x.

    Dữ liệu ra: In ra màn hình dãy (Xn)

    Bài 38:  Tạo một dãy gồm n (3 < n < 20) số nguyên nhận các giá trị ngẫu nhiên từ 1 đến 99.  Xuất dãy  và xuất ra vị trí các số nguyên tố của dãy.

    Dữ liệu vào: Số nguyên n có giới hạn theo đề.

    Kết quả ra: Mảng a ngẫu nhiên và vị trí các số nguyên tố trong mảng.

    Ví dụ:

    Dữ liệu vào Dữ liệu ra
    19

     

    So phan tu cua mang: 19

    Mang a la:

    74 98 69 94  5 11 11 50 21 61 89 73 14 19 55 31 71 50  1

    Vi tri cac so nguyen to co trong a la:  5  6  7 10 11 12 14 16 17

    Lưu ý: số 1 không phải là số nguyên tố

    Bài 39:  Viết chương trình in ra màn hình các số từ x đến y là số chẵn và chia hết cho 3. với x, y nhập từ bàn phím? Đếm xem có tất cả bao nhiêu số?

    Dữ liệu vào: Số nguyên x và y (x < y).

    Kết quả ra: Các số chẵn chia hết cho 3 trong phạm vi từ x đến y và đếm có bao nhiêu số.

    Ví dụ:

    Dữ liệu vào Dữ liệu ra
    3

    40

    12  18  24  30  36

    Co tat ca: 6 so

    Các bài từ 40 đến 64 sau đây lấy từ 100 đề Toán Tin (Tin học &#038; Nhà trường)

    Bài 65: Bạn Huy không tập trung tư tưởng trong giờ toán vì vậy thầy giáo cho thêm bài tập về nhà rèn luyện khả năng tập trung tư tưởng và tính cẩn thận chu đáo. Nội dung bài tập là cho n xâu chỉ bao gồm các ký tự la tinh thường và chữ số. Đoạn các ký tự số liên tục tạo thành một số nguyên. Ở mỗi đoạn ký tự số liên tục Huy phải trích ra số lớn nhất có thể, sắp xếp các số nhận được từ các xâu đã cho và đưa ra theo thứ tự không giảm, mỗi số được đưa ra dưới dạng không có các số 0 không có nghĩa.

    Ví dụ, với n = 1 và xâu là 01a2b3456cde478 dãy số cần đưa ra là 1, 2, 478, 3456.

    Yêu cầu: Cho số nguyên n (1 ≤ n ≤ 100) và n xâu, mỗi xâu có độ dài không quá 100. Hãy đưa ra dãy số nhận được đã sắp xếp theo thứ tự không giảm, mỗi số trên một dòng.

    Dữ liệu: Vào từ file văn bản numbers.inp:

    Dòng đầu tiên chứa số nguyên n,

    Mỗi dòng trong n dòng sau chứa một xâu chỉ gồm các ký tự la tinh thường và số.

    Dữ liệu đảm bảo có không quá 500 số được tách ra.

    Kết quả: Đưa ra file văn bản NUMBERS.OUT dãy số nhận được đã sắp xếp theo thứ tự không giảm, mỗi số trên một dòng.

    Ví dụ:

    numbers.inp numbers.out
    4

    43silos0

    zita002

    le2sim

    231233

    0

    2

    2

    43

    231233

    Bài 66: Hãy viết chương trình đổi tờ giấy bạc có mệnh giá n (Việt Nam đồng) ra ba loại giấy bạc có mệnh giá 500, 200, 100 (Việt Nam đồng) sao cho số tờ gấy bạc phải sử dụng là ít nhất (n được nhập từ bàn phím).

    Bài 67: Tuổi của cha hiện nay là b tuổi, tuổi của con là c tuổi (b-c > 0 và b, c là các số nguyên dương). Hãy viết chương trình (với b, c được nhập từ bàn phím) để kiểm tra xem tuổi cha có gấp đôi tuổi con hay không? Nếu đúng thì đưa ra màn hình thông báo “hiện nay tuổi cha gấp đôi tuổi con”; trường hợp ngược lại, hãy tính số năm n (trước đó hoặc sau đó) tuổi cha gấp đôi tuổi con và đưa ra màn hình thông báo “n năm trước đây tuổi cha gấp đôi tuổi con” hay “sau n năm tuổi cha sẽ gấp đôi tuổi con”.

    Bài 68: Hàng tháng, các hộ dân sử dụng điện đều nhận được một hóa đơn thanh toán tiền điện. Giá tiền điện phải trả được tính như sau:

    • 100 số đầu tiên, mỗi số phải trả 550 đồng,
    • Từ số 101 đến số 150, mỗi số phải trả 1100 đồng,
    • Từ số 151 đến số 200, mỗi số phải trả 1470 đồng,
    • Từ số 201 trở đi, mỗi số phải trả 1600 đồng.

    Số tiền điện mà mỗi hộ dân phải trả ở hóa đơn là tổng số tiền điện mà người đó đã sử dụng với 10% thuế VAT.     Hãy viết chương trình tính số tiền điện mà người tiêu dùng phải trả trong tháng với a là số KW điện mà người tiêu dùng đã sử dụng và được nhập từ bàn phím.

    Bài 69: Nhập vào số tự nhiên n (0 < n < 10) và hai mảng số nguyên A, B có n phần tử đại diện cho hai tập hợp theo yêu cầu không có hai phần tử trùng nhau trong cùng một tập hợp. (Do đó, trong quá trình nhập nếu phần tử vừa nhập vào đã có trong mảng thì không bổ sung vào mảng). In ra màn hình tập hợp A, tập hợp B và các phần tử là giao của hai tập hợp A và B.

    Bài 70:

    1. Nhập một dãy số nguyên có n phần tử (0< n <= 100)
    2. Sắp xếp dãy vừa nhập theo thứ tự tăng dần, in ra màn hình dãy đã sắp thứ tự
    3. Tìm trên dãy đã sắp xếp có phần tử x hay không, với x được nhập từ bàn phím.

    Bài 71: Cho đa thức bậc n:

    A = anxn + an-1xn-1+…+ a1x + a0

    Trong đó an, an-1,…a1,a0 là các hệ số nguyên có giá trị tuyệt đối không quá 100.

    Biết rằng phương trình A = 0 nếu có nghiệm nguyên thì nghiệm nguyên đó chỉ có thể là ước số của hệ số a0.

    Yêu cầu: Hãy tìm tất cả các nghiệm nguyên (nếu có) của phương trình A = 0.

    Bài 72: Kỳ thi học sinh giỏi năm học 2008-2009 của tỉnh Bà Rịa-Vũng Tàu có 8 đội tuyển dự thi đến từ các huyện (TX, TP), số thứ tự các huyện được đánh số lần lượt từ 1 đến 8 là Vũng Tàu, Bà Rịa, Tân Thành, Châu Đức, Xuyên Mộc, Đất Đỏ, Long Điền, Côn Đảo. Mỗi thí sinh dự thi có một số báo danh duy nhất (là một số nguyên dương), mỗi đội tuyển của huyện tối đa 90 thí sinh. Sau khi thi xong Sở Giáo dục- Đào tạo tổ chức cho các thí sinh  giao lưu với nhau, Ban tổ chức sắp xếp các thí sinh đứng thành một vòng tròn, để tạo điều kiện cho các thí sinh trong tỉnh được giao lưu với nhau Ban tổ chức yêu cầu các thí sinh cùng huyện không đứng gần nhau, các thí sinh thuộc 2 huyện có số thứ tự liền kề cũng không được đứng gần nhau.

    Yêu cầu: Hãy giúp Ban tổ chức chỉ ra một cách xếp thỏa mãn yêu cầu trên

    Dữ liệu vào: file ‘pupil.inp’

    Gồm có 8 dòng, dòng thứ i chứa các số báo danh của các thí sinh huyện thứ i, các số báo danh cách nhau ít nhất một dấu cách.

    Dữ liệu ra: file ‘pupil.out’

    (Mô tả cách xếp n thí sinh theo yêu cầu trên một vòng tròn, ta có thể mô tả trên một đường thẳng, trong đó thí sinh đầu và thí sinh cuối đứng gần nhau trên vòng tròn)

    Gồm n dòng (n là tổng số thí sinh), mỗi dòng là số báo danh của thí sinh. Trong trường hợp không có cách nào thỏa mãn yêu cầu thì ghi là -1

    Ví dụ

    Pupil.inp Pupil.out
    1 2 3

    4 5 6

    7 8 9

    10 11 12

    13 14 15

    16 17 18

    19 20 21

    22 23

    1

    22

    16

    7

    17

    23

    2

    18

    8

    3

    9

    10

    4

    11

    5

    12

    6

    13

    19

    14

    20

    15

    21

    Bài 73: Nhập vào một số tự nhiên N với (0 < N ≤ 65535). Hãy cho biết chữ số lớn nhất của số tự nhiên vừa nhập. Hãy in đảo ngược số N.

    Ví dụ: N=6548. Chữ số lớn nhất là: 8. Số in ngược là: 8456.

    Bài 74: Nhập vào một số tự nhiên N với (0 < N ≤ 65535), phân tích số vừa nhập thành các thừa số nguyên tố, nếu số vừa nhập là số nguyên tố thì chỉ thông báo ra màn hình đây là số nguyên tố.

    Ví dụ:

    • Nếu số vừa nhập là 300, thì in ra màn hình 300 = 2. 2. 3. 5. 5
    • Nếu số vừa nhập là 307, thì in ra màn hình “307 là số nguyên tố”

    Bài 75: Tìm tất cả các số nguyên dương x, y, z  thỏa mãn phương trình: ax + by + cz = n; trong đó a, b, c, n là các số nguyên dương (a, b, c ≤ 65535; n ≤ 2.147.483.647)

    Yêu cầu kỹ thuật:

    1. Kiểm tra việc nhập dữ liệu thỏa mãn yêu cầu của đề bài. Nếu người sử dụng nhập sai thì thông báo nhập sai và hỏi người dùng có muốn nhập lại hay không, nếu không thì kết thúc chương trình.
    2. Không được dùng quá 2 vòng lặp lồng nhau và điều kiện dừng của mỗi vòng lặp không được vượt quá ngưỡng mà từ đó ta biết chắc chắn phương trình không có nghiệm.
    3. Nếu phương trình có nghiệm thì liệt kê có thứ tự các bộ nghiệm của phương trình theo dạng sau:

    Giả sử phương trình có dạng 15x + 28y + 24z = 454, ta in ra màn hình như sau:

    STT     x          y          x

    1          10        10        1

    2          14        7          2

    Ngược lại không thì thông báo phương trình không có nghiệm.

    Bài 76: Một số có tổng các ước nhỏ hơn nó bằng chính nó được gọi là số hoàn chỉnh.

    Ví dụ: 6 có các ước nhỏ hơn nó là 1, 2, 3. Tổng là 1 + 2 + 3 = 6.

    Viết chương trình xét xem một số n được nhập từ bàn phím có phải là số hoàn chỉnh không.

    Bài 77: Viết chương trình tìm các số hoàn chỉnh nhỏ hơn n (Với n được nhập từ bàn phím).

    Bài 78: Dãy Fibonacy có hai phần tử đầu là 1, 1. Các phần tử sau bằng tổng hai phần tử đứng ngay trước nó:

    1, 1, 2, 3, 5, 8, 13, 21,…

    Viết chương trình in ra dãy Fibonacy có phần tử lớn nhất nhỏ hơn n?

    Bài 79: Viết chương trình nhập n số, xoá số thứ k trong n số vừa nhập. In ra n-1 số còn lại.

    Bài 80: Viết chương trình cho phép nhập một dãy gồm n số nguyên. Nhập thêm một số và chèn thêm vào dãy sau phần tử k.

    Bài 81: Viết chương trình in ra màn hình tam giác Pascal. Ví dụ, với n=4 sẽ in ra hình sau:

    1          1
    
    1          2          1
    
    1          3          3          1
    
    1          4          6          4          1

    Hàng thứ n được xác định từ hàng n-1:

    • Phần tử đầu tiên và phần tử cuối cùng đều bằng 1.
    • Phần tử thứ 2 là tổng của phần tử thứ nhất và thứ 2 của hàng n-1
    • Phần tử thứ k của hàng thứ n là tổng của phần tử thứ k-1 và k của hàng thứ n-1.

    Bài 82: Viết chương trình tính giai thừa của số n (Viết là n!). Với yêu cầu:

    • Nếu người dùng nhập số n < 0 thì yêu cầu nhập lại.
    • Sử dụng chương trình con để tính giai thừa của một số.

    Bài 83: Viết chương trình cho phép cộng hai phân số.

    Bài 84: Nhập vào một số nguyên dương n. Hãy in ra số nguyên tố nhỏ nhất lớn hơn n. VD: Nhập n = 10. Kết quả in ra số 11.

    Bài 85: Tìm các số tự nhiên nhỏ hơn hoặc bằng n mà sau khi làm phép phân tích ra thừa số nguyên tố có nhiều nhân tử nhất. Ví dụ n=9. Các số có nhiều nhân tử nhất sau khi làm phép phân tích là: 8 = 2.2.2

    Viết chương trình cho phép phân tích một số ra thừa số nguyên tố và ghi kết quả dưới dạng tích các lũy thừa. Ví dụ: 300 = 2^2.3.5^2

    Bài 86: Mọi số tự nhiên đều có thể viết được dưới dạng tổng của hai số nguyên tố. Viết chương trình thực hiện tách một số tự nhiên thành tổng của hai số nguyên tố.

    Bài 87: Hai số tự nhiên A, B được coi là hữu nghị nếu như số này bằng tổng các ước số của số kia và ngược lại. Lập trình tìm và in ra màn hình các cặp số hữu nghị trong phạm vi từ 1 đến 10000. (Lưu ý, số 1 được coi là ước số của mọi số còn mỗi số không được coi là ước số của chính nó).

    Bài 88: Cho dãy số gồm n số. Tìm dãy con lớn nhất các phần tử tăng (giảm) dần.

    Bài 89: Cho dãy số gồm n số. Tìm dãy con lớn nhất các phần tử có cùng dấu, (đan dấu).

    Bài 90: Cho dãy gồm n số. Tìm dãy con lớn nhất đơn điệu (liên tục tăng, giảm hoặc giảm, tăng).

    Bài 91:  Cho dãy số gồm n số nguyên. Tìm dãy con có tổng lớn nhất

    Hướng dẫn. Sử dụng kỹ thuật vét cạn các dãy con, dùng hàm tính tổng dãy con để kiểm tra.

    Bài 92: Gọi abcd là một số có 4 chữ số. Hãy lập chương trình tìm tất cả các số có 4 chữ số thỏa mãn biểu thức: abcd=(ab + cd)^2. Ví dụ 2025=(20 + 25)^2.

    Bài 93:  Viết chương trình cho nhập hai số tự nhiên Nk. Hãy cho biết chữ số thứ k tính từ trái sang phải trong số N là chữ số nào? Nếu k lớn hơn độ dài của N hoặc k bằng 0 thì thông báo không tìm được.

    Bài 94:  Một số được gọi là số bậc thang nếu biểu diễn thập phân của nó có nhiều hơn một chữ số đồng thời theo chiều từ trái qua phải, chữ số đứng sau không nhỏ hơn chữ số đứng trước. Viết chương trình in ra các số bậc thang trong đoạn [n1, n2] với n1, n2 được nhập từ bàn phím.

    Bài 95: Viết chương trình cho phép đổi một số từ cơ số 10 sang cơ số bất kỳ.

    Thuật toán:

    • Dùng mảng CS để lưu các chữ số.
    • Lặp khi n <> việc: Chia n cho s lấy phần dư. Lấy phần dư làm chỉ số để lấy và lưu chữ số. Gán n = n div s.

    Chú ý chữ số lấy sau sẽ nằm trước.

    Bài 96: Viết chương trình cho phép đổi một số từ cơ số bất kỳ sang cơ số 10.

    Bài 97: Năm 1973, nhà Toán học Neil Sloan đưa ra khái niệm độ bền của một số nguyên không âm N như sau:

    • Nếu N có một chữ số thì độ bền của N bằng 0.
    • Nếu N có từ hai chữ số trở lên thì độ bền của N bằng độ bền của số nguyên là tích các chữ số của N cộng 1.

    Cho N từ 0  đến 2.000.000.000, tìm số bé hơn N có độ bền lớn nhất.

    Ví dụ

    Persist.inp Persist.out Giải thích
    100 77 Doben(77)=Doben(49)+1=Doben(36)+1+1=Doben(18)+1+1+1=Doben(8)+1+1+1+1=0+1+1+1+1=4

    Hướng dẫn.

    • Để tìm độ bền một số cần một hàm TICH(n) tính tích các chữ số của n.
    • Cho d = 0. Lặp lại điều kiện n >9 việc tăng d lên 1 thay n = TICH(n).
  • Đề thi đầu vào của công ty MDC

    Đề thi đầu vào của công ty MDC

    Đề thi đầu vào của công ty MDC

    Công ty cổ phần Tập đoàn MDC (MDC Group) hoạt động trong các lĩnh vực công nghệ thông tin, sản xuất, y tế, phòng cháy – chữa cháy, phân phối & bán lẻ.

    Trong các công ty liên kết với viện CNTT&TT của BKHN thì MDC chọn cách phỏng vấn ứng viên bằng một bài test nhỏ. Thường khi các công ty test ứng viên bằng bài test thì sẽ là thuật toán là chủ yếu nha, là những thứ như cấu trúc dữ liệu & thuật toán, thuật toán ứng dụng, những kiến thức về đồ thị,…

    Xem thêm KINH NGHIỆM PHỎNG VẤN FLUTTER

    Vệ tinh

    Tập đoàn viễn thông đa quốc gia UltraCom hiện sở hữu một hệ thống truyền tin gồm N trung tâm truyền nhận dữ liệu (gọi tắt là trung tâm) nằm rải rác khắp địa cầu (các trung tâm này được đánh số từ 1 đến N) và M vệ tinh (gọi tắt là vệ tinh) cũng được phân bố đều khắp trên bầu trời quanh địa cầu (các vệ tinh này được đánh số từ 1 đến M).

    Mỗi trung tâm i đều có thể thiết lập kết nối trực tiếp (để khai thác) với mỗi vệ tinh j với chi phí xác định Cij nào đó.

    Hai trung tâm được xem là thông băng với nhau nếu chúng cùng được kết nối với một vệ tinh hoặc chúng cùng thông băng với một số trung tâm khác.

    Toàn hệ thống của UltraCom đương nhiên vốn là thông băng hoàn toàn, tức là bất kỳ hai trung tâm nào cũng đều thông băng với nhau.

    Một sự cố bí ẩn vừa diễn ra trong thời gian gần đây đã khiến một số kết nối bị hư hỏng hoàn toàn và hệ thống của UltraCom bị rơi vào tình trạng không thông băng hoàn toàn được, đặt ra nhiệm vụ cấp bách cho UltraCom phải khẩn trương khắc phục hậu quả này.

    Sau sự cố, bộ phận phụ trách kỹ thuật của UltraCom đã tiến hành khảo sát toàn hệ thống và nhận thấy rằng:

    1. Mỗi trung tâm đều vẫn còn đang kết nối bình thường với một số các vệ tinh đồng thời mỗi vệ tinh đều còn đang được kết nối bởi một số trung tâm nào đó.
    2. Một số kết nối vừa bị hỏng sẽ không thuộc diện xem xét khắc phục nữa, do chi phí quá lớn.
    3. Hoàn toàn có phương án khả thi để khắc phục hệ thống thông băng hoàn toàn.

    Để tiết kiệm chi phí tại thời điểm nhạy cảm của nền kinh tế toàn cầu, ban lãnh đạo tập đoàn quyết định sẽ chỉ thiết lập lại một số kết nối đã bị hư hỏng sao cho tổng chi phí khắc phục là nhỏ nhất có thể.

    Yêu cầu: Xác lập phương án cụ thể và tổng chi phí nhỏ nhất để UltraCom khắc phục sự cố

    Dữ liệu vào: Cho trong file văn bản REPAIR.INP, gồm:

    • Dòng đầu ghi tuần tự 2 số nguyên dương N, M (2 ≤ M, N ≤ 1000)
    • Dòng thứ i trong N dòng tiếp theo ghi M số nguyên Ci1, …, CiM (-1 ≤ Cij ≤10000; i = 1, …, N; j = 1, 2,…, M) với ý nghĩa: Cij là chi phí để kết nối trung tâm i với vệ tinh j cùng sự lưu ý đặc biệt: Cij = 0 nếu trung tâm i vẫn đang kết nối bình thường được với vệ tinh j, Cij = -1 nếu bỏ qua việc tái lập sự kết nối giữa trung tâm i với vệ tinh j (do chi phí quá lớn).
    • Tất cảc các số nguyên trên cùng dòng đều cách nhau bởi khoảng trống. Dữ liệu luôn đảm bảo tính đúng đắn để có lời giải, tức là luôn có phương án để UltraCom khắc phục sự cố.

    Kết quả: Ghi ra file văn bản REPAIR.OUT các thông tin sau:

    • Dòng đầu ghi một số nguyên, là tổng chi phí nhỏ nhất tìm được. Thông tin này chiếm 50% số điểm của test.
    • Dòng thứ 2 ghi số nguyên dương K, với K là số kết nối cần khắc phục. Thông tin này chiếm 25% số điểm của test.
    • K dòng tiếp theo, mỗi dòng ghi hai số nguyên c, s (cách nhau bởi khoảng trống) cho biết cần tái lập kết nối giữa trung tâm c với vệ tinh s. Nếu có nhiều kết quả (phương án), chỉ cần chỉ ra một trong chúng. Thông tin trên K dòng này chiếm 25% số điểm của test.

    Ví dụ:

    REPAIR.INP
    4 3
    0 -1 5
    0 4 4
    -1 0 -1
    1 2 0
    
    REPAIR.OUT
    3 2
    4 1
    4 2
    
    REPAIR.INP
    4 4
    0 -1 5 3
    -1 4 5 -1
    -1 0 -1 0
    6 7 0 -1
    

    Ràng buộc:

    • 60% số test ứng với 60% số điểm của bài ứng với N, M ≤ 200.
    • Giới hạn thời gian cho mỗi test: 01 giây.

    Hướng dẫn: Sử dụng thuật toán tham lam, xác định tập lớn nhất các trung tâm đang thông băng (S) , sắp xếp các kết nối theo thứ tự chi phí từ nhỏ đến lớn, sau đó thực hiện kết nối mới (C) vào tập với điều kiện trung tâm X chưa nằm trong tập (S).

    Cây và Rừng

    Một cấu trúc dạng cây được tổ chức trong CSDL quan hệ dưới dạng các dòng của bảng như sau.

    Đề thi đầu vào của công ty MDC 20

    Trong đó, node gốc trong cây sẽ có mã node cha là 0. Có thể có nhiều cây khác nhau trong rừng. Số dòng tối đa có thể lên đến 1.000.000

    Yêu cầu:

    1. Đọc từ tệp tin tree.txt các node của cây vào bộ nhớ, tệp tin gồm nhiều dòng, mỗi dòng là một node chứa 3 trường thông tin: Mã của node, mã node cha, tên của node.
    2. Nhập vào một cặp mã node XY, trả lời xem X có phải là node cha (ông, cụ…) của Y hay không. Hiển thị ra màn hình mối quan hệ của XY (ví dụ: X=>A=>B=>Y)
    3. Nhập vào một mã node X, in ra màn hình tất cả các node con, cháu, chắt….của X (bao gồm mã node, tên node, mỗi cái trên một dòng).
    4. Hiện thời gian thực hiện thuật toán cho ý 2 và 3, tính theo ms (milisecond)

    Đề thi tham khảo từ https://www.tailieubkhn.com/2021/06/de-thi-dau-vao-mdc.html

  • 100+ Bài tập Python cơ bản có lời giải

    100+ Bài tập Python cơ bản có lời giải

    Mời bạn xem phiên bản đầy đủ tại đây https://divin.dev/python/2022/03/14/20-bai-tap-python.html

    Mời bạn xem thêm Bài tập Python cơ bản lớp 10 được chia theo từng chủ đề.

    Bài tập Python cơ bản

    Bài 1. In toàn bộ các số chẵn từ 1000 đến 2000.

    even_numbers=[]
    
    for i in range(1000, 2001):
        if (i%2=0):
            even_numbers.append(str(i))
    print (','.join(even_numbers))

    Bài 2. Viết chương trình tìm tất cả các số chia hết cho 7 nhưng không phải bội số của 5, nằm trong đoạn 20003200 (tính cả 20003200). Các số thu được sẽ được in thành chuỗi trên một dòng, cách nhau bằng dấu phẩy.

    j=[] for i in range(2000, 3201):
      if (i%7==0) and (i%5!=0):
        j.append(str(i))
    print (','.join(j))

    Nếu chỉ cần in ra màn hình kết quả, chúng ta có thể không cần sử dụng List.

    for i in range(2000, 3201):
        if (i % 7 == 0) and (i % 5 != 0):
            print(i, end=' ')

    Bài 3. Viết một chương trình có thể tính giai thừa của một số cho trước. Kết quả được in thành chuỗi trên một dòng, phân tách bởi dấu phẩy. Ví dụ, số cho trước là 8 thì kết quả đầu ra phải là 40320.

    n = int(input("Nhập số cần tính giai thừa:")) 
    def fact(n):
        if n==0:
            return 1
        else:
            return n*fact(n-1)
    print(fact(n))

    Nếu chỉ sử dụng vòng lặp, không sử dụng hàm và lời gọi đệ quy, ta có thể làm như sau:

    n = int(input('Enter a number '))
    factorial = 1
    for i in range(1,n+1):
        factorial *= i
    print(factorial)

    Bài 4. Với số nguyên n nhất định, hãy viết chương trình để tạo ra một dictionary chứa (i, i*i) như là số nguyên từ 1 đến n (bao gồm cả 1n) sau đó in ra dictionary này. Ví dụ: Giả sử số n8 thì đầu ra sẽ là: {1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64}.

    n = int(input('Enter a number '))
    d = dict()
    for i in range(1, n+1):
        d[i] = i*i
    print(d)

    Bài 5. Viết chương trình chấp nhận một chuỗi số, phân tách bằng dấu phẩy từ giao diện điều khiển, tạo ra một List  và một tuple chứa mọi số.

    Ví dụ: Đầu vào được cung cấp là 34,67,55,33,12,98 thì đầu ra là:

    ['34', '67', '55', '33', '12', '98']
    ('34', '67', '55', '33', '12', '98')

    Chương trình này chỉ đơn giản là sử dụng hàm split() và chuyển một List sang một tuple.

    values=input("Nhập vào các giá trị:") 
    l=values.split(",") 
    t=tuple(l) 
    print (l) 
    print (t)

    Bài 6. Viết một hàm tính giá trị bình phương của một số.

    # square of a number
    x = int(input("Enter a number: "))
    def square(x):
        return x * x

    Bài 7. Viết chương trình tính số Fibonacci thứ n, với n nhập vào từ bàn phím.

    # find fibonacci number
    n = int(input("Enter a number: "))
    def fibonacci(n):
        if n == 0:
            return 0
        elif n == 1:
            return 1
        else:
            return fibonacci(n-1) + fibonacci(n-2)

    Bài 8. Viết một chương trình nhập vào một danh sách các số và tạo một danh sách mới chỉ gồm phần tử đầu tiên và cuối cùng của danh sách đó. Viết chương trình sử dụng hàm.

    Ví dụ, nhập vào danh sách [5, 10, 15, 20, 25] thì kết quả trả về là danh sách [5, 25]

    def list_ends(a_list):
        return [a_list[0], a_list[len(a_list)-1]]

    Bài 9. Viết một hàm nhận vào ba số thực và trả về số lớn nhất trong ba số. Lưu ý, không sử dụng hàm max() của Python.

    # max of three numbers
    def max_of_three(a, b, c):
        if a > b:
            if a > c:
                return a
            else:
                return c
        else:
            if b > c:
                return b
            else:
                return c

    Bài 10. Viết chương trình yêu cầu người dùng nhập vào một chuỗi và in ra màn hình thông báo chuỗi đó có phải là chuỗi palindrome hay không. (Chuỗi Palindrome là một chuỗi mà đọc xuôi và ngược đều như nhau, ví dụ ABCDCBA.)

    Cách giải thứ nhất, sử dụng cách đảo ngược xâu:

    wrd=input("Please enter a word")
    wrd=str(wrd)
    rvs=wrd[::-1]
    print(rvs)
    if wrd == rvs:
        print("This word is a palindrome")
    else:
        print("This word is not a palindrome")

    Cách thứ hai, sử dụng vòng lặp for

    def reverse(word):
       x = ''
       for i in range(len(word)):
          x += word[len(word)-1-i]
       return x
    
    word = input('give me a word:\n')
    x = reverse(word)
    if x == word:
       print('This is a Palindrome')
    else:
       print('This is NOT a Palindrome')

    Bài 11. Viết chương trình hỏi người dùng một số tự nhiên n và in ra tất cả ước số của con số đó.

    n = int(input("Enter a number: "))
    for i in range(1, n + 1):
        if n % i == 0:
            print(i)

    Bài 12. Viết một chương trình (sử dụng các hàm) yêu cầu người dùng nhập một chuỗi dài gồm nhiều từ. In lại cho người dùng một chuỗi mới với thứ tự từ ngữ được đảo ngược lại với thứ tự ban đầu. Ví dụ, khi người dùng nhập chuỗi: Toi la Phuong thì in ra màn hình Phuong la Toi

    sentense = input("Enter a sentence: ")
    words = sentence.split()
    words.reverse()
    sentence = " ".join(words)
    print(sentence)

    Bài 13. Viết chương trình kiểm tra xem số n có là số nguyên tố hay không.

    # check prime number
    n = int(input("Enter a number: "))
    for i in range(2, n):
        if n % i == 0:
            print("Not a prime number")
            break
    else:
        print("Prime number")

    Bài 14. Viết một chương trình nhập vào hai số tự nhiên m, n. In ra màn hình mảng hai chiều mà phần tử trong hàng thứ i và cột thứ j của mảng là i*j.

    Ví dụ: Giá trị m, n nhập vào là 35 thì đầu ra là: [[0, 0, 0, 0, 0], [0, 1, 2, 3, 4], [0, 2, 4, 6, 8]]

    m, n = map(int, input('Enter two numbers: ').split())
    array2 = [[0 for i in range(n)] for j in range(m)]
    for row in range(m):
        for col in range(n):
            array2[row][col] = row * col
    print(array2)

    Bài 15. Viết một chương trình nhận chuỗi từ do người dùng nhập vào, phân tách nhau bởi dấu phẩy và in những từ đó thành chuỗi theo thứ tự bảng chữ cái, phân tách nhau bằng dấu phẩy.

    Giả sử đầu vào được nhập là: without,hello,bag,world thì đầu ra sẽ là bag,hello,without,world.

    items=[x for x in input("Nhập một chuỗi: ").split(',')]
    items.sort()
    print (','.join(items))

    Bài 16. Viết chương trình giải phương trình bậc hai $ax^2+bx+c=0$ với a, b, c là số nguyên và được nhập vào từ bàn phím.

    a, b, c = map(int, input('Nhập a, b, c cách nhau bằng dấu cách: ').split())
    if a == 0:
        if b == 0:
            if c == 0:
                print("Phương trình có vô số nghiệm")
            else:
                print("Phương trình vô nghiệm")
        else:
            print("Phương trình có một nghiệm x =", -c/b)
    else:
        delta = b**2 - 4*a*c
        if delta < 0:
            print("Phương trình vô nghiệm")
        elif delta == 0:
            print("Phương trình có nghiệm kép x1 = x2 =", -b/(2*a))
        else:
            print("Phương trình có 2 nghiệm phân biệt x1 =", (-b + delta**0.5)/(2*a), "và x2 =", (-b - delta**0.5)/(2*a))

    Bài 17. Viết chương trình tính tổng của các chữ số của môt số nguyên dương n trong Python. Số nguyên dương n được nhập từ bàn phím.

    def totalDigitsOfNumber(n):
        total = 0;
        while (n > 0):
            total = total + n % 10;
            n = int(n / 10);
        return total;
     
    n = int(input("Nhập số nguyên dương n = "));
    print("Tổng các chữ số của", n , "là", totalDigitsOfNumber(n));

    Bài 18. Viết chương trình sinh các xâu nhị phân có độ dài n.

    Xem lời giải tại đây Thuật toán sinh các dãy nhị phân có độ dài n

    Bài 19. Viết chương trình giải bài toán Bài toán Tháp Hà Nội (Tower of Hanoi)

    Bài 20. Viết chương trình phân tích số nguyên dương n thành thừa số nguyên tố.

    def phanTichSoNguyen(n):
        i = 2;
        listNumbers = [];
        # phân tích
        while (n > 1):
            if (n % i == 0):
                n = int(n / i);
                listNumbers.append(i);
            else:
                i = i + 1;
        # nếu listNumbers trống thì add n vào listNumbers
        if (len(listNumbers) == 0):
            listNumbers.append(n);
        return listNumbers;
     
    n = int(input("Nhập số nguyên dương n = "));
    
    listNumbers = phanTichSoNguyen(n);
    size = len(listNumbers);
    sb = "";
    for i in range(0, size - 1):
        sb = sb + str(listNumbers[i]) + " x ";
    sb = sb + str(listNumbers[size-1]);
    # in kết quả ra màn hình
    print("Kết quả:", n, "=", sb);

    Bài 21. Định nghĩa một class có ít nhất 2 method:

    • getString: để nhận một chuỗi do người dùng nhập vào từ giao diện điều khiển.
    • printString: in chuỗi vừa nhập sang chữ hoa.

    Thêm vào các hàm hiểm tra đơn giản để kiểm tra method của class.

    Ví dụ: Chuỗi nhập vào là o2.edu.vn thì đầu ra phải là O2.EDU.VN

    class InputOutString(object):
       def __init__(self):
           self.s = ""
    
       def getString(self):
           self.s = input("Nhập chuỗi:")
       def printString(self):
           print (self.s.upper())
    
    strObj = InputOutString()
    strObj.getString()
    strObj.printString()
    

    Bài 22. Viết chương trình Python tính tổng các phần tử của một danh sách.

    n=10
    a=[2, -4, 1, 9, -3, 6, 3, -2, 6, 8]
    for i in range(0,n): print(a[i],' ',end='')
    print()
    
    tong=0
    for i in range(0,n):
        tong+=a[i]
    print('Tổng =',tong)
    

    Bài 23. Viết chương trình Python đếm số lượng các số hạng dương và tổng của các số hạng dương.

    n=10
    a=[2, -4, 1, 9, -3, 6, 3, -2, 6, 8]
    
    dem=0
    tongd=0
    for i in range(0,n):
        if a[i]>0:
           dem+=1
           tongd+=a[i]
    print('Số hạng dương:',dem)
    print('Tổng số dương:',tongd)

    Hoặc có thể sử dụng hàm:

    def count_positive_numbers_and_sum(numbers):
        count = 0
        sum = 0
        for number in numbers:
            if number > 0:
                count += 1
                sum += number
        return count, sum
    
    # Sử dụng hàm trên với một danh sách các số nguyên bất kỳ
    numbers = [1, 2, 3, -4, -5, 6, 7, -8, 9]
    count, sum = count_positive_numbers_and_sum(numbers)
    
    print("Số lượng các số hạng dương là:", count)
    print("Tổng các số hạng dương là:", sum)
    

    Bài 24. Viết chương trình Python tính trung bình cộng của cả danh sách, trung bình cộng các phần tử dương trong danh sách.

    n=10
    a=[2, -4, 1, 9, -3, 6, 3, -2, 6, 8]
    
    for i in range(0,n):tong+=a[i]
    print('Trung bình cộng của danh sách:',tong)
    dem=0
    tongd=0
    for i in range(0,n):
        if a[i]>0:
           dem+=1
           tongd+=a[i]
    print('Trung bình cộng các số dương:',tongd/dem)

    Bài 25. Viết chương trình Python tìm vị trí của phần tử âm đầu tiên trong danh sách.

    n=10
    a=[2, -4, 1, 9, -3, 6, 3, -2, 6, 8]
    
    i=0
    while a[i]>=0:
        i+=1
        if i==n:
           break
    if i==n:
        print('Không có phần tử âm')
    else:
        print('Vị trí phần tử âm đầu tiên:',i+1)

    Bài 26. Viết chương trình Python tìm vị trí của phần tử dương cuối cùng trong danh sách.

    n=10
    a=[2, -4, 1, 9, -3, 6, 3, -2, 6, 8]
    i=n-1
    while a[i]<=0:
       i-=1
       if i==-1:
          break
    if i==-1:
        print('Không có phần tử dương')
    else:
        print('Vị trí phần tử dương cuối cùng:',i+1)

    Bài 27. Viết chương trình Python tìm phần tử lớn nhất của danh sách và vị trí phần tử lớn nhất cuối cùng.

    n=10
    a=[2, -4, 1, 9, -3, 6, 3, -2, 6, 8]
    
    max=a[0]
    vt=0
    for i in range(1,n-1):
        if a[i]>max:
            max=a[i]
            vt=i
    print('Số lớn nhất là',max,'tại vị trí',vt+1)

    Bài 28. Viết chương trình Python tìm phần tử lớn thứ nhì của danh sách và các vị trí của các phần tử đạt giá trị lớn nhì.

    n=10
    a=[2, -4, 1, 9, -3, 6, 3, -2, 6, 8]
    
    B=a.copy()
    m=max(B)
    i=0
    while i<len(B):
        if B[i]==m:
            B.remove(B[i])
            i-=1
        i+=1
    if len(B)==0:
        print("Khong co so lon nhi")
    else:
        m=max(B)
        print("So lon nhi la",m,"tai vi tri",end=" ")
        for i in range(len(a)):
            if a[i]==m:
                print(i+1,end=", ")

    Bài 29. Viết chương trình Python tính số lượng các số dương liên tiếp nhiều nhất.

    n=10
    a=[2, -4, 1, 9, -3, 6, 3, -2, 6, 8]
    
    d=len(a)
    i=0
    maxd=0
    while i<d:
        while a[i]<=0:
            i+=1
            if i==d:break
        if i<d:
            max1=0
            j=i
            while a[j]>0:
                max1+=1
                j+=1
                if j==d: break
            if max1>maxd: 
                maxd=max1
            i=j
        i+=1
    print('So duong lien tiep dai nhat =',maxd)

    Bài 30. Viết chương trình Python tính số lượng các số dương liên tiếp có tổng lớn nhất.

    n=10
    a=[2, -4, 1, 9, -3, 6, 3, -2, 6, 8]
    
    d=len(a)
    i=0
    sumd=0
    while i<d:
        while a[i]<=0:
            i+=1
            if i==d:break
        if i<d:
            sum1=0
            j=i
            while a[j]>0:
                sum1+=a[j]
                j+=1
                if j==d: break
            if sum1>sumd: 
                sumd=sum1
            i=j
        i+=1
    print('Tong so duong lien tiep dai nhat =',sumd)
    

    Bài 31. Viết chương trình Python tính số lượng các phần tử liên tiếp đan dấu nhiều nhất (dãy phần tử liên tiếp được gọi là đan dấu nếu tích hai phần tử liên tiếp âm).

    n=10
    a=[2, -4, 1, 9, -3, 6, 3, -2, 6, 8]
    
    d=len(a)
    i=0
    maxdd=0
    for i in range(d-1):
        max1=0
        while a[i]*a[i+1]<0:
            max1+=1
            i+=1
            if i==d-1:break
        if max1>maxdd: maxdd=max1
    if maxdd>0: maxdd+=1
    print('Day so dan dau dai nhat =',maxdd)

    Bài 32. Viết chương trình Python tính số lượng các phần tử không tăng nhiều nhất.

    Bài 33. Viết chương trình Python tìm vị trí bắt đầu đoạn con dương liên tiếp có nhiều phần tử nhất.

    Bài 34. Viết chương trình Python tìm đoạn con có các số hạng dương liên tiếp có tổng lớn nhất. (Nếu có nhiều đoạn con thoả mãn thì đưa ra màn hình: Số đoạn con thoả mãn và các đoạn con đó).

    Bài 35. Viết chương trình Python đếm số lượng các phần tử bằng giá trị x nhập từ bàn phím.

    n=10
    a=[2, -4, 1, 9, -3, 6, 3, -2, 6, 8]
    
    x=float(input('Nhập 1 số từ bàn phím: '))
    dem=0
    for i in range(0,n):
        if a[i]==x:
            dem=dem+1
    print('Số lượng phần tử bằng',x,':',dem)

    Bài 36. Viết chương trình Python chuyển các phần tử dương của danh sách lên đầu danh sách và in danh sách ra màn hình.

    Bài 37. Viết chương trình Python tìm số phần tử là dương và là số nguyên tố của danh sách và vị trí của nó trong danh sách.

    Bài 38. Viết chương trình Python chèn một số m (m nhập vào từ bàn phím ) vào đầu danh sách, cuối danh sách và vị trí thứ 5 của danh sách.

    Bài 39. Viết chương trình Python chèn danh sách [1,2,3] vào vị trí đầu, cuối và thứ 5 của danh sách.

    Bài 40. Viết chương trình Python xóa phần tử thứ k (k nhập từ bàn phím) trong danh sách.

    Bài 41. Viết chương trình Python sắp xếp danh sách theo thứ tự tăng dần, giảm dần.

    n=10
    a=[2, -4, 1, 9, -3, 6, 3, -2, 6, 8]
    
    x=float(input('Nhập 1 số từ bàn phím: '))
    dem=0
    for i in range(0,n):
        if a[i]==x:
            dem=dem+1
    print('Số lượng phần tử bằng',x,':',dem)
    #--------------------------------------------------------
    # Bài 41. Sắp xếp danh sách tăng dần, giảm dần
    #Sắp xếp danh sách tăng
    for i in range(0,n-1):
       for j in range(i+1,n):
          if a[i]>a[j]:
             t=a[i]
             a[i]=a[j]
             a[j]=t
    print('Danh sách đã sắp xếp tăng:')
    print(a)
    #Sắp xếp danh sách giảm
    for i in range(0,n-1):
       for j in range(i+1,n):
          if a[i]<a[j]:
             t=a[i]
             a[i]=a[j]
             a[j]=t
    print('Danh sách đã sắp xếp giảm:')
    print(a)
    

    (Còn tiếp)

  • Ý nghĩa của các màu sắc cơ bản

    Ý nghĩa của các màu sắc cơ bản

    Khi tạo các slide thuyết trình (Powerpoint, Canva, Figma…) bạn cần hiểu được Ý nghĩa của các màu sắc cơ bản để sử dụng màu sắc đúng cách. Sử dụng màu sắc đúng cách sẽ giúp truyền tải thông điệp tốt, tăng hiệu quả của một bài thuyết trình.

    Mời các bạn xem thêm Cách chọn màu sắc trong thiết kếTự học figma online miễn phí để thiết kế UI/UX cho dự án của mình.

    ý nghĩa của các màu sắc cơ bản
    • Đỏ: Sức mạnh / Sự ấm áp / Năng lượng / Ý chí sống còn / Động lực / Nam tính / Phấn khích / Thách thức / Hung hăng / Gò bó / Hiệu ứng thị giác / Hiệu ứng vật lí.
    • Xanh dương: Trí thông minh / Kết nối / Niềm tin / Hiệu quả / Thanh bình / Trách nhiệm / Logic / Lạnh lùng / Phản chiếu / Bình tĩnh / Xa cách / Vô cảm / Kém thân thiện.
    • Vàng: Lạc quan / Tự tin / Kiêu hãnh / Xa hoa / Sức mạnh cảm xúc / Thân thiện / Sáng tạo / Vô lí trí / Sợ hãi / Cảm xúc yếu đuối / Trầm cảm / Bồn chồn / Tự tử.
    • Xanh lá: Hòa hợp / Cân bằng / Sự tươi mới / Sự nghỉ ngơi / Hàn gắn / Trấn an / Vô tư / Hòa bình / Chán nản / Tù đọng / Suy yếu.
    • Tím: Năng lượng tinh thần / Tầm nhìn / Sự xa hoa / Tính xác thực / Sự thật / Chất lượng / Nội tâm / Sự điêu tàn / Bó buộc / Thấp kém.
    • Cam: Xoa dịu vật lý / Đồ ăn / Sự ấm áp / Sự an toàn / Khoái cảm thể xác / Đam mê / Sự dồi dào / Niềm vui / Mất mát / Ức chế / Sự phù phiếm / Thiếu trưởng thành.
    • Hồng: Bình yên thể xác / Nuôi dưỡng / Sự ấm áp / Nữ tính / Tình yêu / Dục tính / Sự sinh tồn / Cư trú / Thảm họa tinh thần / Sự yếu đuối thể xác.
    • Xám : Thái độ trung lập / Thiếu tự tin / Ẩm ướt / Trầm cảm / Lầm lì / Thiếu năng lượng.
    • Đen: Tinh tế / Huyền ảo / An toàn / An toàn cảm xúc / Hiệu quả / Bản chất / Áp bức / Lạnh lùng / Đe dọa / Nặng nề.
    • Trắng: Sạch sẽ / Vô trùng / Sáng rõ / Tinh khôi / Tối giản / Tinh tế / Hiệu quả / Lạnh lùng / Rào cản / Thiếu thân thiện / Chủ nghĩa đẳng cấp.
    • Nâu: Nghiêm túc / Ấm áp / Thiên nhiên / Đáng tin cậy / Hỗ trợ / Thiếu tính hài hước / Nặng nề / Thiếu tinh tế.

    Xem thêm 10 nguyên tắc thiết kế slide PowerPoint

    Ý nghĩa của màu đỏ

    • Từ thời xa xưa, con người đã có những cảm xúc mãnh liệt cháy trong người và họ sợ hãi với màu đỏ khi nó gắn liền với lửa và máu, chiến tranh và sự hi sinh. Tuy nhiên, nhiều quốc gia hiện nay lại lấy màu đỏ là màu sắc chủ đạo cho quốc kỳ quốc gia, Việt Nam là một ví dụ điển hình trong đó. Cờ đỏ như một biểu tượng hào hùng cho quá khứ của mình.
    Ý nghĩa của các màu sắc cơ bản 21
    • Ngoài sự liên tưởng đến sự bạo lực, chứa sức mạnh mãnh liệt trong màu đỏ ra thì nó còn ẩn chứa sự nồng cháy, sự cuồng nhiệt. Có lẽ một phần vì thế mà màu sắc này rất được chị em phụ nữ ưa thích.
    • Ngoài ra, màu đỏ còn được sử dụng nhiều trong các tôn giáo. Từ thời xa xưa, những viên đá quý màu đỏ như: ruby, kim cương đỏ đều có giá trị rất lớn và được tin rằng có khả năng trừ tà và mang lại may mắn cho chủ nhân của nó.

    Ý nghĩa của màu xanh dương

    Ý nghĩa của các màu sắc cơ bản 22
    • Màu xanh dương (xanh lam) hay còn được biết đến là xanh nước biển, xanh da trời. Đây là màu sắc được rất nhiều người ưa thích bởi tính dịu mát, nhẹ nhàng mà nó mang lại.
    • Màu xanh dương có nhiều ý nghĩa hơn tất cả các màu sắc khác. Thông thường sẽ có 3 màu xanh dương chủ đạo
      • Xanh dương đậm: là đại diện cho sự tin tưởng, sự thông minh, phẩm chất.
      • Xanh dương sáng: thể hiện sự trong sáng, mạnh mẽ, độc lập.
      • Xanh da trời: đại diện cho hòa bình, sự thanh thản, thanh tao, tinh thần.

    Ý nghĩa của màu vàng

    • Màu vàng là màu tốt nhất để tăng sự nhiệt tình trong cuộc sống của bạn và có thể đóng góp với sự tự tin và lạc quan hơn. Nó thích những thách thức, đặc biệt là các loại tinh thần. Trong tâm lý màu sắc, màu vàng được gọi là màu của giao tiếp. Đó là một diễn giả, nhà mạng và nhà báo tuyệt vời, những người làm việc và giao tiếp ở cấp độ tinh thần. Màu vàng là nhà khoa học, người liên tục phân tích mọi thứ và nhìn một cách có phương pháp trên cả hai mặt của một vụ án, trước khi đưa ra quyết định. Màu vàng cũng là nghệ sĩ giải trí, diễn viên hài và chú hề.
    Ý nghĩa của các màu sắc cơ bản 23
    • Màu vàng giúp đưa ra quyết định và liên quan đến sự rõ ràng của suy nghĩ và ý tưởng mới. Màu vàng cũng giúp chúng ta tập trung, nghiên cứu và ghi nhớ thông tin. Điều này có thể hữu ích trong các tình huống kiểm tra. Màu vàng cũng có thể gây lo lắng khi nó di chuyển nhanh về phía trước trong cuộc sống, khiến chúng ta lo lắng. Nó có thể liên quan đến việc sợ hãi, hèn nhát hoặc ghen tị. Có lẽ bạn đã nghe nói về thuật ngữ cảm giác màu vàng. Màu vàng cũng có xu hướng làm cho bạn phân tích và phê phán tinh thần nhiều hơn, bao gồm tự phê bình, cũng như phê bình đối với người khác.
    • Màu vàng , màu của ánh nắng mặt trời, hy vọng và hạnh phúc, có những liên tưởng mâu thuẫn. Một mặt màu vàng tượng trưng cho sự tươi mới, hạnh phúc, tích cực, rõ ràng, năng lượng, lạc quan, giác ngộ, tưởng nhớ, trí tuệ, danh dự, lòng trung thành và niềm vui, nhưng mặt khác, nó đại diện cho sự hèn nhát và lừa dối. Một màu vàng xỉn hoặc bẩn thỉu có thể đại diện cho sự thận trọng, bệnh tật và ghen tuông.
    • Màu vàng sáng là màu thu hút sự chú ý và khi được sử dụng kết hợp với màu đen, sẽ tạo ra một trong những kết hợp màu dễ nhất để đọc và nhìn từ khoảng cách xa. Đây là lý do tại sao xe buýt trường học, xe taxi và biển báo giao thông được sơn màu vàng và đen.
    • Nếu màu vàng được sử dụng quá mức, nó có thể có tác dụng đáng lo ngại. Ví dụ, một thực tế đã được chứng minh rằng trẻ sơ sinh khóc nhiều hơn trong phòng sơn màu vàng. Quá nhiều màu vàng gây mất tập trung và làm cho nó khó hoàn thành một nhiệm vụ. Quá nhiều màu vàng cũng có thể khiến mọi người trở nên quan trọng và đòi hỏi cao. Quá ít màu vàng gây ra cảm giác cô lập và sợ hãi, bất an và lòng tự trọng thấp. Việc thiếu màu vàng có thể khiến người ta trở nên cứng nhắc, xảo quyệt, chiếm hữu hoặc phòng thủ.

    Ý nghĩa của màu xanh lá

    Ý nghĩa của các màu sắc cơ bản 24

    Ý nghĩa của màu tím

    • Màu tím là một màu sắc đẹp để thưởng thức và tạo ra từ hai màu tuyệt vời, xanh và đỏ. Thường thì màu tím có liên quan đến sự sang trọng, sức mạnh, trí tuệ, sáng tạo và ma thuật.
    • Khi bạn nhìn vào màu tím một cách tâm lý, đó là màu cân bằng giữa màu đỏ và màu xanh. Màu đỏ có xu hướng mang lại cường độ và năng lượng cho màu sắc, trong khi màu xanh lam mang lại sự thư giãn và ổn định, cùng nhau chúng tạo nên màu sắc rực rỡ của màu tím là sự cân bằng hoàn hảo của cả hai.
    Ý nghĩa của các màu sắc cơ bản 25

    Ý nghĩa của màu cam

    • Màu cam là sự kết hợp của màu đỏ và màu vàng. Đó là một màu tươi sáng và ấm áp. Nó đại diện cho lửa, mặt trời, vui vẻ, ấm áp và môi trường nhiệt đới.
    Ý nghĩa của các màu sắc cơ bản 26
    • Màu cam được coi là một màu sắc vui vẻ, nhẹ nhàng với chất lượng ngon miệng và ngon miệng. Nó cũng làm tăng việc cung cấp oxy cho não và kích thích hoạt động tinh thần.
    • Màu cam được giới trẻ chấp nhận cao. Là một màu cam quýt, ý nghĩa màu cam có liên quan đến thực phẩm lành mạnh và nó kích thích sự thèm ăn. Các nhà thiết kế thường sử dụng màu cam để minh họa một cái gì đó nhiệt đới, một cái gì đó hài hước hoặc một cái gì đó cho những người trẻ tuổi.
  • 10 nguyên tắc thiết kế slide PowerPoint

    10 nguyên tắc thiết kế slide PowerPoint

    10 nguyên tắc thiết kế slide PowerPoint

    Để có một bài thuyết trình bằng Powerpoint chuyên nghiệp, thu hút người xem thì bạn cần tuân thủ những nguyên tắc trình bày Powerpoint. Dưới đây, chúng tôi giới thiệu 10 nguyên tắc thiết kế slide PowerPoint để tạo hiệu quả tốt nhất.

      #Nguyên tắc thiết kế slide PowerPoint: TỐI GIẢN

      • Quá nhiều chi tiết trên cùng một slide làm phân tán sự chú ý của người theo dõi bởi không biết đâu mới là nội dung chính.
      • Loại bỏ các yếu tố không thật sự cần thiết trên slide, giữ lại những điều cốt lõi trong bài trình chiếu là cách giúp bạn tạo nên điểm nhấn cho một bài trình chiếu.
      • Một slide chỉ nên chứa từ 3 – 5 ý chính (không chứa nội dung dài lan man, phần nội dung bạn hãy chuẩn bị kĩ, ghi nhớ hoặc sử dụng tài liệu in sẵn).
      • Tương tự hình ảnh chèn vào cũng không nên nhiều quá 3 hình, vì quá nhiều hình cũng sẽ làm phân tán nội dung không biết thông điệp cần truyền tải nhanh là gì.
      nguyên tắc thiết kế slide PowerPoint

      #Nguyên tắc thiết kế slide PowerPoint: ÍT CHỮ

      • Khi theo dõi thuyết trình mọi người thường thích tiếp thu thông tin thông qua người trình bày thay vì đọc slide.
      • Thay vì cố gắng trình bày chi tiết nội dung lên slide bạn hãy tóm tắt chúng thành các từ khóa và diễn giải bằng lời trong lúc thuyết trình.
      • Tối kị việc bạn chiếu nguyên cả trang sách, tài liệu lên màn hình và đọc chúng.

      Ví dụ: Slide sau tóm tắt Những kỹ thuật mới trong kiến thức hiện đại thành 3 ý lớn giúp nội dung slide được xúc tích hơn, nếu người thiết kế thêm hết vào slide nội dung của từng ý sẽ khiến trang slide rất khó đọc vì cỡ chữ nhỏ, vừa không làm nổi bật được ý chính muốn truyền tải.

      10 nguyên tắc thiết kế slide PowerPoint 27

      #Nguyên tắc thiết kế slide PowerPoint: SỬ DỤNG LAYOUT

      • Nên sử dụng các layout (bố cục) có sẵn của Powerpoint, các layout này thường đã được tối ưu về màu sắc, font chữ và kích thước.
      10 nguyên tắc thiết kế slide PowerPoint 28

      #Nguyên tắc thiết kế slide PowerPoint: SỬ DỤNG ĐÚNG MÀU SẮC

      • Màu sắc là điểm nhấn cho slide và cũng tác động khá lớn đến nhận thức của người theo dõi. Màu sắc quá sặc sỡ là một điểm trừ trong thiết kế slide PowerPoint vì sẽ làm người dùng phân tâm, không tập trung vào nội dung truyền tải.
      • Bạn nên chọn màu theo nguyên tắc bánh xe màu mà các nhà thiết kế thường sử dụng và chỉ nên sử dụng tối đa 5 màu chủ đạo trong toàn bộ slide của bạn.
      • Duy trì sự tương phản giữa văn bản và nền góp phần làm cho thông điệp của bạn nổi bật và dễ đọc hơn, từ đó thu hút nhiều hơn sự chú ý của người nhìn.
      • Nếu hình nền của bạn có nhiều màu sắc thay đổi, các phần của văn bản của bạn có thể hơi khó nhìn. Khi đó, bạn có thể sử dụng các thanh màu đằng sau hình ảnh giúp dễ đọc và tạo điểm thu hút người xem.
      • Xem thêm Ý nghĩa của các màu sắc cơ bản
      10 nguyên tắc thiết kế slide PowerPoint 29

      #Nguyên tắc thiết kế slide PowerPoint: FONT CHỮ NHẤT QUÁN

      • Font chữ và màu sắc là 2 yếu tố quyết định rất nhiều đến hình thức và thẩm mỹ của một bài trình chiếu.
      • Nhiều bạn thiết kế slide thường nghĩ font chữ đơn giản sẽ khiến slide trở nên đơn điệu, font chữ cầu kỳ sẽ làm slide bị rối, nhưng thật sự chỉ cần bạn chọn font phù hợp với nội dung và thông tin bạn đang truyền tải thì dù font đơn giản hay cầu kỳ cũng sẽ mang về hiệu quả.
      • Trong 1 bài trình chiếu chỉ nên sử dụng khoảng 3 font chữ (font chữ dành cho tiêu đề – Heading, font chữ dành cho nội dung và font chữ dành cho các chú thích…).

      #Nguyên tắc thiết kế slide PowerPoint: CỠ CHỮ DỄ ĐỌC

      • Cỡ chữ nhỏ nhất nên là 28px. Bài trình chiếu của bạn thường sẽ được phát ở màn hình rộng để mọi người cùng theo dõi.
      • Dù bạn đã thiết kế đẹp đến đâu nhưng người xem không thể đọc được chữ vì kích thước chữ quá bé sẽ là một điều rất tệ. Do đó bạn nên để cỡ chữ nhỏ nhất cho bài trình chiếu của mình là 28px.

      #Nguyên tắc thiết kế slide PowerPoint: 6X6

      • Nguyên tắc chuyên nghiệp 6×6 là quy tắc thể hiện mức tối đa số dòng và số chữ trên cùng 1 slide.
      • Trong nguyên tắc này, một slide của bạn sẽ chỉ nên có tối đa 6 dòng và mỗi dòng tối đa 6 chữ. Để lại nhiều khoảng trống trên slide giúp slide dễ nhìn hơn, người xem cũng dễ tập trung và theo dõi nội dung hơn.
      10 nguyên tắc thiết kế slide PowerPoint 30

      #Nguyên tắc thiết kế slide PowerPoint: HÌNH ẢNH CÓ MỤC ĐÍCH

      Bài trình chiếu sẽ thu hút được nhiều người hơn khi được thể hiện một cách trực quan, sinh động.

      • Chọn những hình ảnh minh họa liên quan đến nội dung. Tránh sử dụng các hình ảnh không liên quan, làm người đọc mất tập trung vào nội dung chính.
      • Sắp xếp bố cục một cách hợp lý, chú ý đến kích cỡ ảnh.
      • Sử dụng hình ảnh có chất lượng cao nhất có thể.
      • Sử dụng biểu đồ và đồ thị để trực quan hóa các khái niệm, data.

      #Nguyên tắc thiết kế slide PowerPoint: KHÔNG LẠM DỤNG HIỆU ỨNG

      Các hiệu ứng được áp dụng vào bài trình chiếu một cách hợp lý và không quá lạm dụng sẽ giúp slide uyển chuyểnbớt nhàm chán hơn. Chẳng hạn trong slide trình bày nội dung của một câu hỏi trắc nghiệm, bạn áp dụng hiệu ứng khoanh tròn cho phần đáp án.

      Ví dụ: Mục Animations trong Powerpoint sẽ giúp bạn tạo hiệu ứng chuyển động cho văn bản, mục Transitions sẽ hỗ trợ bạn thêm các hiệu ứng chuyển cho các slide.

      #Nguyên tắc thiết kế slide PowerPoint: CĂN LỀ

      Các đối tượng trong thiết kế không được căn chỉnh hợp lý dễ tạo ra sự khó chịu cho người xem. Do đó bạn cần sắp xếp, căn chỉnh bố cục và mọi chi tiết trên slide để phần thiết kế được khoa học và hài hòa hơn.

      Để thực hiện điều này: Nhấn giữ phím Shift + Chọn tất cả các đối tượng mà bạn muốn căn chỉnh, sau đó chọn tùy chọn Arrange, và áp dụng Alignment Type.

      10 nguyên tắc thiết kế slide PowerPoint 31

      #Nguyên tắc thiết kế slide PowerPoint: GIỚI HẠN SỐ SLIDE

      • Một bài giảng không nên có quá nhiều slide, việc này giúp người thuyết trình tập trung vào những vấn đề trọng tâm và loại bỏ những thứ rườm rà. Đồng thời, việc có số lượng slide vừa phải cũng giúp tiết kiệm thời gian thao tác bấm chuyển slide.
      • Không có một con số chính xác số slide là bao nhiêu, tuy nhiên chúng tôi đề xuất, với một bài thuyết trình có thời lượng khoảng 30-45 phút thì số slide nên khoảng 10 slide.
    • Quy hoạch động là gì?

      Quy hoạch động là gì?

      Quy hoạch động là gì?

      Quy hoạch động (Dynamic Programming) là kĩ thuật được được dùng khi có một công thức truy hồi và một (hoặc một vài) trạng thái bắt đầu. Một bài toán được tính bởi các bài toán nhỏ hơn đã tìm ra trước đó, một kĩ thuật giải quyết các bài toán khi có thể giải quyết bài toán đó bằng cách sử dụng lại các bài toán nhỏ hơn đã được giải quyết và lưu lại kết quả.

      1. Quy hoạch động là gì?

      Theo thầy Lê Minh Hoàng thì

      Các thuật toán đệ quy có ưu điểm dễ cài đặt, tuy nhiên do bản chất của quá trình đệ quy, các chương trình này thường kéo theo những đòi hỏi lớn về không gian bộ nhớ và một khối lượng tính toán khổng lồ. Quy hoạch động (Dynamic programming) là một kỹ thuật nhằm đơn giản hóa việc tính toán các công thức truy hồi bằng cách lưu trữ toàn bộ hay một phần kết quả tính toán tại mỗi bước với mục đích sử dụng lại.

      Dynamic Programming = Solving Recurrence + Memoization

      Hiểu đơn giản, QUY HOẠCH ĐỘNG = GIẢI QUYẾT TRUY HỒI + GHI NHỚ KẾT QUẢ. Quy hoạch động có độ phức tạp đa thức nên sẽ chạy nhanh hơn quay lui và vét cạn.

      2. Khi nào thì dùng Quy hoạch động?

      Không có một quy tắc chung nào để cho biết một bài toán có giải được bằng quy hoạch động hay không. Tuy nhiên, nếu bài toán có hai tính chất sau thì bạn có thể nghĩ tới quy hoạch động:

      • Có một hệ thức truy hồi. Tức là, bài toán lớn có thể giải quyết dựa vào các bài toán con lồng nhau. Chẳng hạn số Fibonacci f(n) được tính dựa vào hai số thứ f(n-1)f(n-2).
      • Một hoặc nhiều bài toán con đã được giải quyết (biết trạng thái). Ví dụ đối với bài toán tìm số Fibonacci thì số f(0)f(1) là đã biết trước.

      bài toán quy hoạch động

      Nghe có vẻ giống như đệ quy, một bài toán lớn được chia nhỏ thành các bài toán con lồng nhau. Nhưng, phương pháp quy hoạch động sẽ lưu kết quả của bài toán con này, và khi được gọi, nó sẽ không cần phải tính lại, do đó làm giảm thời gian tính toán.

      Ví dụ, đối với bài toán tìm số Fibonacci thứ n, nếu sử dụng đệ quy đơn thuần, chúng ta rất nhiều bài toán con sẽ được tính đi tính lại, điển hình là các số fib(0) và fib(1).

      def fib(n):
          if n <= 1:
              return n
          return fib(n -1) + fib(n - 2)

      Nếu sử dụng quy hoạch động, mỗi bài toán con fib(i) sẽ được lưu lại trước khi tính những bài toán con lớn hơn. Nhờ đó, mà việc tính toán giảm đi đáng kể, mỗi bài toán con chỉ cần tính đúng một lần.

      def fib(n):
          dp = [0] * (n + 1)
          dp[1] = 1
          for i in range(2, n + 1):
              dp[i] = dp[i - 1] + dp[i - 2]
          return dp[n]

      Như vậy, vấn đề mấu chốt ở đây là gì?

      Đệ quy chỉ đơn giản là gọi lại chính nó. Quy hoạch động là một cách để giải quyết các vấn đề có cấu trúc cụ thể (cấu trúc con tối ưu) trong đó một vấn đề có thể được chia thành các vấn đề con tương tự như bài toán ban đầu.

      Ghi nhớ kết quả là một cách để tối ưu hóa các thuật toán quy hoạch động dựa trên đệ quy. Và, chúng ta không phải giải quyết bài toán con một lần nữa nếu chúng đã được giải quyết.

      Rõ ràng người ta có thể gọi đệ quy để giải quyết một bài toán quy hoạch động, nhưng nó không cần thiết. Người ta có thể giải một bài toán quy hoạch động mà không cần đệ quy (chẳng hạn trong bài tính số Fibonacci bằng quy hoạch động ở trên, chúng ta thấy không có lời gọi đệ quy nào cả).

      3. Một số ví dụ về Quy hoạch động

      Phân tích số nguyên dương

      Cho số tự nhiên n 100. Hãy cho biết có bao nhiêu cách phân tích số n thành tổng của dãy các số nguyên dương, các cách phân tích là hoán vị của nhau chỉ tính là một cách. (Bài toán này được viết lại dựa theo sách của thầy Lê Minh Hoàng).

      Ví dụ: n = 5 có 7 cách phân tích:

      1. 5 = 1 + 1 + 1 + 1 + 1
      2. 5 = 1 + 1 + 1 + 2
      3. 5 = 1 + 1 + 3
      4. 5 = 1 + 2 + 2
      5. 5 = 1 + 4
      6. 5 = 2 + 3
      7. 5 = 5

      Lưu ý: n = 0 vẫn coi là có 1 cách phân tích thành tổng các số nguyên dương, là tổng của dãy rỗng.

      Để giải bài toán này, chúng ta có thể dùng phương pháp liệt kê tất cả các cách phân tích và đếm số cấu hình. Tuy nhiên, khi số cách phân tích tương đối lớn, phương pháp liệt kê tỏ ra khá chậm. Chẳng hạn với n = 100190569292 cách phân tích.

      Nhận xét:

      Nếu gọi F[m, v] là số cách phân tích số v thành tổng các số nguyên dương nhỏ hơn hoặc bằng m thì khi đó, các cách phân tích số v thành tổng các số nguyên dương nhỏ hơn hoặc bằng m có thể chia làm hai loại:

      • Loại 1: Không chứa số m trong phép phân tích, khi đó số cách phân tích loại này chính là số cách phân tích số v thành tổng các số nguyên dương nhỏ hơn m, tức là số cách phân tích số v thành tổng các số nguyên dương nhỏ hơn hoặc bằng m - 1 và bằng F[m-1, v].
      • Loại 2: Có chứa ít nhất một số m trong phép phân tích. Khi đó nếu trong các cách phân tích loại này ta bỏ đi số m đó thì ta sẽ được các cách phân tích số v - m thành tổng các số nguyên dương nhỏ hơn hoặc bằng m (Lưu ý, điều này chỉ đúng khi không tính lặp lại các hoán vị của một cách). Có nghĩa là về mặt số lượng, số các cách phân tích loại này bằng F[m, v - m].

      Trong trường hợp m > v thì rõ ràng chỉ có các cách phân tích loại 1, còn trong trường hợp m ≤ v thì sẽ có cả các cách phân tích loại 1 và loại 2. Vì thế, công thức truy hồi là: $$F[m,v]=\begin{cases} F[m-1,v] &\text{ nếu } m>v\\ F[m-1,v] +F[m,v-m]&\text{ nếu } m \leqslant v \end{cases}$$

      Tìm số lượng đồng xu

      Cho $N$ đồng xu, giá trị của mỗi đồng là $V_0,V_1,…,V_{N−1}$, và số $S$. Tìm số lượng đồng xu nhỏ nhất để tổng giá trị của chúng bằng $S$ (số lượng đồng xu không giới hạn).

      Với bài toán này, chúng ta cần xây dựng và giải các bài toán con lồng (gối) nhau. Với ví dụ của chúng ta, mỗi bài toán con dp(P) với P<= S là bài toán tìm số đồng xu nhỏ nhất để khối lượng của chúng là P. và dp(P) = k chính là số lượng đồng xu nhỏ nhất đó.

      Chúng ta sẽ áp dụng phương pháp quy hoạch động bằng cách bắt đầu từ bài toán con dp(0) sau đó tiếp tục với các bài toán con lớn hơn. Lời giải của các bài toán con sẽ được xây dựng lần lượt cho đến chúng ta xây dựng đến bài toán dp(S) và đó chính là kết quả của bài toán lớn. Một điều cần lưu ý với kỹ thuật này là bài toán con tiếp theo sẽ không thể giải được nếu chúng ta chưa giải bài toán con trước đó.

      Cuối cùng là phần khó nhất của mọi bài toán quy hoạch động, đó là trả lời câu hỏi: cấu trúc con tối ưu của bài toán này ở đâu. Hay nói một cách khác, làm thế nào để từ những bài toán nhỏ hơn có thể tổ hợp ra lời giải cho bài toán lớn. Với vị dụ kinh điển này, mọi thứ sẽ tương đối đơn giản, nhưng với những bài toán phức tạp hơn, chúng ta cần suy nghĩ và tính toán nhiều hơn.

      Quay trở lại với bài toán của chúng ta. Giả sử P là tổng khối lượng của các đồng xu nặng lần lượt là V1, V2, ..., Vj. Để có được khối lượng P, chúng ta cần thêm vài đúng 1 đồng xu nặng U vào khối lượng Q sao cho Q + U = P. Tất nhiên, bài toán con dp(Q) chúng ta đã có lời giải nên chúng ta sẽ biết được cần bao nhiêu đồng xu cho dp(P). Và vì có nhiều đồng xu U (nhiều nhưng hữu hạn) nên chúng ta có thể cần đến nhiều bài toán con trước đó, và dp(p) là giá trị nhỏ nhất sau khi tổng hợp những bài toán con đó.

      Ví dụ với n = 3, S = 11, W = [1, 3, 5].

      • Bắt đầu với bài toán con 0 ta có dp(0) = 0
      • Với bài toán con 1, có 1 đồng xu (nặng 1) có thể thêm vào từ 0 đồng xu nào cả. Vậy dp(1) = dp(0) + 1 = 1.
      • Với bài toán con 2, cũng chỉ có 1 đồng xu (nặng 1) có thể thêm vào từ 1 đồng xu. Vậy dp(2) = dp(1) + 1 = 2.
      • Với bài toán con 3, chúng ta có thể thêm 1 đồng xu 3 vào 0 đồng xu hoặc thêm 1 đồng xu 1 vào 2 đồng xu. Rõ ràng là cách đầu tiên cho kết quả nhỏ hơn. Vậy dp(3) = min(dp(2) + 1, dp(0) + 1) = min(3, 1) = 1
      • Cứ tiếp tục như vậy cho đến bài toán S chính là đáp án chúng ta cần tìm.

      Về mặt cài đặt, quy hoạch động thường lưu kết quả vào một mảng. Trong ví dụ của chúng ta, mảng dp[0..S] sẽ lưu kết quả cho từng bài toán con. Nói cách khác, dp[P] = k nghĩa là cần ít nhất k đồng xu để có khối lượng là P Toàn bộ mảng này sẽ được tính bằng vòng lặp. Đoạn code sau mô tả toàn bộ quá trình này.

      n, S = map(int, input().split())
      w = list(map(int, input().split()))
      dp = [0] * (S + 1)
      dp[0] = 0
      
      for P in range(1, S + 1):
          dp[P] = min(dp[P - x] for x in w if x <= P) + 1
      
      print(dp)
      print(dp[S])
      
      # Nếu đầu vào như sau: n = 3, S = 11, w = [1, 3, 5]
      # Thì bảng lời giải cho các bài toán con sẽ lần lượt như sau:
      # P = 0 |1 |2 |3 |4 |5 |6 |7 |8 |9 |10|11
      # ------+--+--+--+--+--+--+--+--+--+--+--
      # k = 0 |1 |2 |1 |2 |1 |2 |3 |2 |3 |2 |3

      Bạn có thể tham khảo thêm MỘT SỐ BÀI TOÁN QUY HOẠCH ĐỘNG ĐIỂN HÌNH