# 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;