You are on page 1of 5

TRƯỜNG ĐẠI HỌC GIAO THÔNG VẬN TẢI

KHOA CÔNG NGHỆ THÔNG TIN

BÀI TẬP LỚN

PHÂN TÍCH THIẾT KẾ THUẬT TOÁN

Giảng viên hướng dẫn: Phạm Xuân Tích

Sinh viên thực hiện: Nguyễn Tiến Dũng

Mã sinh viên: 213311210

Lớp: Kỹ thuật Robot và trí tuệ nhân tạo K62

Hà Nội, 2023
MỤC LỤC
1.1 Đề bài..........................................................................................................3

1.2 Ý tưởng.......................................................................................................3

1.3 Thuật toán..................................................................................................4

1.4 Code............................................................................................................4
1. Bài toán

*Đề bài:

Xây tháp chắn lẻ (http://laptrinhonline.club/problem/a823c4qd)

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?

*Phân tích bài toán:

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

B1: Nhập số lượng khối đồ chơi n.

B2: Khởi tạo hàng đợi ưu tiên cao Q lưu kích thước các khối.

B3: Nhập kích thước các khối và cho vào Q.

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

B5: Khi Q còn phần tử, ta thực hiện:

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ì:

+Cập nhật khối hiện tại, curr=Q.top, Q.pop

+Cập nhật kết quả res+=curr.

Ngược lại thì bỏ khối đó đi Q.pop

B6: Xuất kết quả.

1.4. Code
#include<bits/stdc++.h>

using namespace std;

int main(){

int n; cin>>n;

priority_queue<long, vector<int>, less<int> > Q;

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;

You might also like