Dùng stack để tính lượng mưa tạo thành bởi cột đó và các cột bên trái nó. (hơi phức tạp)
Số nhỏ nhất trong dãy chắc chắn là giá tiền đã giảm. Loại bỏ nó và số = 4/3 nhân với nó ra khỏi dãy (dùng map để đánh dấu đã xóa). Xóa xong cả 2 số rồi thì số nhỏ nhất tiếp theo sẽ chắc chắn là giá tiền mới. cứ thế đến khi nào hết toàn bộ dãy.
Xét riêng các vị trí chẵn và lẻ. Sau mỗi lần nhảy, các vị trí lẻ sẽ dịch theo chiều kim đồng hồ sang 1 vị trí và giữ nguyên thứ tự. Các vị trí chẵn thì ngược lại. Sau K lần nhảy thì sẽ xác định được vị trí của nó sử dụng công thức:
p = p-1; // Đổi về cơ số 0, tức là các vị trí sẽ bắt đầu đếm từ số 0 -> n-1
if (p%2==0) {
// Vị trí lẻ
p = p+k*2; // Sau mỗi lần nhảy 0 chiếm vị trí của 2, 2 chiếm vị trí của 4 .v.v. Nên sau k lần nhảy p sẽ chiếm vị trí của (p+k*2)%n
} else {
// Chẵn ngược lại
p = (p-k*2)%n+n;
}
khi đó 2 người bên cạnh p là p-1 & p+1
int x = (p-1+n)%n+1;
int y = (p+1+n)%n+1;
cout << min(x,y) << ' ' << max(x,y) << '\n';
Cộng trừ basic. bài này yêu cầu cẩn thận vì có test hiểm, như cộng tràn phút >= 60 thì phải đá sang giờ. Nếu giờ sau khi cộng trừ âm thì phải +24h và -1 ngày.
If else
Tính tổng bình thường.
Sử dụng Quy hoạch động. Bảo thầy dạy bài này cho