---
# System prepended metadata

title: HD HSG 11 BDH 21

---

# HD HSG 11 BDH 21

[Nhận xét đề thi](https://hackmd.io/gnOHw_IVSIysTTtRN0MdkA)

## Bài 1:
Dùng priority_queue: lấy ra 2 số nhỏ nhất, cộng lại rồi add kết quả vào lại. Lặp lại cho đến khi còn 1 phần tử

## Bài 2:
Hàm F(N) như sau:
* Nếu N<=9 thì trả về 1;
* Nếu N=1000 thì trả về 1000;
* a=N/100; b = N%100/10; c= N%10;
* Nếu N<=99 thì
    * Nếu b=c thì trả về 11
    * Ngược lại, trả về 10;
* Nếu a=b=c thì trả về 111;
* Nếu a=b≠c thì trả về 110;
* Nếu a≠b=c thì trả về 100;
* Nếu a=c≠b thì trả về 101;
* Trả về 102

## Bài 3
Làm như mô tả: tích các chữ số tối đa 9^9. Tổng các chữ số tối đa 81.
Có thể dùng quy hoạch động chữ số.

## Bài 4:
Quy hoạch động
Gọi F[i] là tổng tiền nhỏ nhất để thuê bảo vệ từ thời điểm 0 đến i (i=0..n). Ban đầu F[i]= ∞ hết, riêng F[0]=0;
Sort tăng dần theo thời điểm bắt đầu
Với mỗi vệ sĩ i: F[j]=min(F[j],F[si]+ci), j=si+1..ti;
Đáp án F[n]

Hướng 2:
Sort vệ sĩ tăng dần theo thời điểm kết thúc (ti)
Gọi F[i] là tổng tiền nhỏ nhất để thuê bảo vệ từ thời điểm 0 đến thời điểm mà người vệ sĩ i kết thúc canh gác (i=1..m). 

F[0]=0;
Với mỗi i chạy từ 1 đến m:
*   Nếu s[i] = 0 thì F[i]=c[i], ngược lại F[i]=∞;

Với mỗi i chạy từ 1 đến m:
*   Tìm j nhỏ nhất mà t[j] ≥ s[i];   (1)
*   Nếu không có j thì tiếp tục vòng lặp;
*   F[i] = c[i]+min(F[j..i-1])       (2)

Viết F[m];

Ghi chú:
(1) có thể dùng TKNP;
(2) tìm min trên đoạn;