BÁO CÁO BÀI TẬP LỚN-MÔN-CẤU TRÚC DỮ LIỆU đề tài bố trí phòng họp - Pdf 27

LOGO
TRƯỜNG ĐẠI HỌC SƯ PHẠM TPHCM
KHOA CÔNG NGHỆ THÔNG TIN
LỚP TIN HỌC KHÓA 35
BÁO CÁO BÀI TẬP LỚN
MÔN: CẤU TRÚC DỮ LIỆU 2
GVHD: ThS. NGUYỄN THỊ BÍCH NGÂN
THỰC HIỆN: NHÓM 25
NGUYỄN NGỌC NHẤT LINH
ĐINH VĂN QUYÊN
ĐỀ BÀI

Tên đề bài: Bố trí phòng họp.

Mô tả: Có n cuộc họp, cuộc họp thứ i bắt đầu
vào thời điểm si và kết thúc ở thời điểm fi.
Do chỉ có một phòng hội thảo nên 2 cuộc
họp bất kì sẽ được cùng bố trí phục vụ nếu
khoảng thời gian làm việc của chúng chỉ giao
nhau tại đầu mút. Hãy bố trí phòng họp để
phục vụ được nhiều cuộc họp nhất.
2
PHÂN TÍCH BÀI TOÁN

Giả sử ta có một tập S = {1, 2, …, n} gồm n cuộc
họp nhưng chỉ có 1 phòng hội thảo nên chỉ có
thể được dùng cho một cuộc họp tại một lúc.

Mỗi cuộc họp i có thời điểm bắt đầu si và một
thời điểm kết thúc fi, mà si ≤ fi. Nếu được lựa
chọn, cuộc họp i diễn ra trong thời khoảng [si, fi).

end
5
TỔ CHỨC DỮ LIỆU
int s[MAX];//lưu thời gian bắt đầu
cuộc họp
int f[MAX];//lưu thời gian kết thúc
cuộc họp
char *name[MAX];//Lưu tên khoa có
cuộc họp
int luu[MAX];//Lưu cuộc họp đã xếp
lịch
int n;//số cuộc họp có thể có
int dem=0;//lưu tổng số cuộc họp
hiện tại đã được bố trí
6
CÁC HÀM CHÍNH
void nhapDuLieuCuocHop();
void sapXep();//sắp xếp tăng theo
thời gian kết thúc
void boTriLichHop();
void xuatLichHop();
7
HÀM BỐ TRÍ LỊCH HỌP
void boTriLichHop()
{
//dem=0;
luu[dem]=0;
for(int i=1; i<n; ++i)
{
if(s[i]>=f[luu[dem]])

10
MỘT HƯỚNG ĐI KHÁC…

Giả sử dãy cuộc họp đã được sắp xếp tăng
dần theo thời gian kết thúc.

Hàm mục tiêu : y = độ dài dãy cuộc họp
được sắp

Gọi L(i) là độ dài dãy cuộc họp được sắp dài
nhất, các phần tử lấy trong miền từ 1 đến i
và phần tử cuối cùng là i.
11
1
2 3 … i i+1
Dãy cuộc họp
PP QUY HOẠCH ĐỘNG

Nhận xét: Với cách làm này ta đã chia 1 bài
toán lớn (dãy con của n cuộc họp) thành các
bài toán con cùng kiểu có kích thước nhỏ
hơn (dãy con của dãy có i cuộc họp đầu
tiên). Vấn đề là công thức truy hồi để phối
hợp kết quả của các bài toán con.
12
PP QUY HOẠCH ĐỘNG

Ta có công thức QHĐ để tính L(i) như sau:

L(0) = 1. (Hiển nhiên)

14
TẠO BẢNG

TH riêng đơn giản nhất: khi i=0:

L[0]=1 (hiển nhiên)

truoc[0]=-1

TH i>0:

Đặt LMax={L[j]: f[j]<=s[i], 0<=j<i}

L[i]=LMax+1;

truoc[i]=j tương ứng khi tìm thấy LMax
15
TẠO BẢNG

Ví dụ:
16
i 0 1 2 3 4 5 6 7
s[i] 1 4 3 12 11 10 14 27
f[i] 3 6 9 13 18 22 27 31
L[i] 1 2 2 3 3 3 4 5
truoc[i] -1 0 0 1 1 1 3 6
TẠO BẢNG

HÀM TẠO BẢNG
void taoBangLichHop()

18
i s[i] f[i] truoc[i]
7 27 31 6
6 14 27 3
3 12 13 1
1 4 6 0
0 1 3 -1
Dừng
TRA BẢNG

HÀM TRA BẢNG:
void traBangLichHop()
{
int i=0;
for(int j=1; j<n; ++j)
if(L[i]<L[j])
i=j;
int max=y=L[i]-1;//i la chi so co L[i] lon nhat
// vi mang trong C++ bat dau tu 0 nen phai -1
while(i>-1)
{
luu[max ]=i;
i=truoc[i];
}
}
19
NHẬN XÉT

Giải thuật Quy hoạch động có ưu thế hơn giải
thuật Quay lui khi biết lợi dụng những bài


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status