Professional Documents
Culture Documents
BTL 1
BTL 1
Hà Nội, 2023
MỤC LỤC
1.1 Đề bài..........................................................................................................3
1.2 Ý tưởng.......................................................................................................3
1.4 Code............................................................................................................4
1. Bài toán
*Đề bài:
Koi có rất nhiều khối đồ chơi hình lập phương, hôm nay cậu muốn xây một tòa tháp
vừa vững chắc vừa đẹp bằng cách chồng các khối lên nhau.
Để tháp được chắc chắn cậu muốn khối ở dưới phải có thể tích không nhỏ hơn khối ở
trên. Đồng thời để tháp được "đẹp" cậu muốn hai khối liên tiếp phải khác tính chẵn lẻ.
Chiều cao của tháp được tính bằng tổng các cạnh của những khối làm nên tháp đó.
Cho một dãy số nguyên dương là độ dài cạnh các khối đồ chơi của Koi, hỏi Koi có thể
xây tòa tháp vững chắc và đẹp cao tối đa bao nhiêu?
Bài toán cho các khối lập phương có các kích thước khác nhau, ta cần phải xếp các
khối lập phương này chồng lên nhau sao cho khối ở dưới không nhỏ hơn khối ở trên và
hai khối liên tiếp phải khác tính chẵn lẻ.
1.2. Ý tưởng
Ta lấy các khối lập phương theo thứ tự giảm dần về kích thước. Với mỗi khối thứ i,
nếu nó thỏa mãn yêu cầu bài toán thì ta xếp chồng lên khối trước đó, ngược lại thì loại
bỏ khối đó đi. Tính chiều cao của tháp khi đã thử hết các khối.
*Minh họa: 6 khối với các kích thước lần lượt 3,6,5,3,1,1.
Kích thước khối Khối hiện tại Tính chẵn lẻ Chiều cao tháp
6 6
5 6 TM 11
3 5 Không TM 11
3 5 Không TM 11
1 5 Không TM 11
1 5 Không TM 11
1.3. Thuật toán
B2: Khởi tạo hàng đợi ưu tiên cao Q lưu kích thước các khối.
B4: Khởi tạo biến curr lưu kích thước của khối hiện tại, curr=Q.top và biến
res=curr
Nếu khối tiếp theo thỏa mãn tính chẵn lẻ với khối hiện tại thì:
1.4. Code
#include<bits/stdc++.h>
int main(){
int n; cin>>n;
for(int i=0;i<n;i++)
int x;
cin>>x;
Q.push(x);
int curr=Q.top();Q.pop();
long res=curr;
while(Q.size()){
if((curr+Q.top())%2==1){
curr=Q.top();
res += curr;
Q.pop();
else Q.pop();
cout<<res;