PDA

View Full Version : Ông già Nôen


cashier
21-11-2007, 10:29 PM
mong các bạn chuyên Tin Lam Sơn giúp đỡ :
Bài 01. Ông già Nôen.
Dọc theo một tuyến phố thẳng có N ô đất kế tiếp nhau đánh số từ 1 đến N. Hiện tại chỉ có ô đất thứ K (1 ≤ K ≤ N) đã xây dựng nhà có độ cao là H[K], còn các ô đất khác để trống. Theo qui hoạch, thành phố sẽ xây dựng tại ô đất thứ i (1 ≤ i ≤ N, i ≠ K) ngôi nhà với độ cao H[i].
Sau khi lấy ý kiến của dân phố, người ta muốn xây dựng các ngôi nhà liền nhau và các cầu thang giữa hai ngôi nhà kề nhau để ông già Nôen có thể theo các thang để phát quà cho trẻ em. Độ dài của thang nối hai nhà kề nhau có độ dài bằng giá trị tuyệt đối của hiệu độ cao của hai nhà.
Yêu cầu: Hãy sắp xếp các nhà vào các ô ( trừ ô K) sao cho tổng độ dài của thang nhỏ nhất.
Dữ liệu vào cho trong tệp SC.INP:
+ Dòng đầu chứa số nguyên dương N ≤ 10000.
+ Dòng sau chứa N số nguyên dương H[i] ≤ 106, 1 ≤ i ≤ N.
+ Dòng cuối cùng chứa số nguyên dương K.
Kết quả xuất ra tệp SC.OUT:
+ Dòng đầu là tổng độ dài ngắn nhất của các thang.
+ Một số dòng tiếp theo là dãy độ cao của các nhà sẽ xây dựng tại các ô thứ i (1 ≤ i ≤ N), trong đó độ cao của ngôi nhà thứ K vẫn giữ nguyên.
Chỉ cần đưa ra một phương án kết quả.
Ví dụ.
SC.INP
5
7 3 4 2 6
2

SC.OUT
5
2 3 4 6 7

nếu có thể thì cho mình luôn code hoặc chỉ cần chỉ cho mình thuật toán thôi :)
cám ơn trước

Mr. Pitô
23-11-2007, 08:38 PM
Trừ H[k] ra, sắp các độ cao còn lại theo thứ tự tăng dần và giảm dần, chọn cái nào tối ưu hơn. Cách này có vẻ là hơi tham, chưa nghĩ được cách nào khác ^^

cashier
23-11-2007, 10:10 PM
Trừ H[k] ra, sắp các độ cao còn lại theo thứ tự tăng dần và giảm dần, chọn cái nào tối ưu hơn.
Vậy h[k] sắp ở đâu hả bạn ??

Mr. Pitô
24-11-2007, 12:52 PM
K là ngôi nhà đã xây dựng rồi mà bạn, H[k] không đổi.
N<=10000, H[i]<106 thì bạn sort bằng đếm phân phối cho nhanh -> O(N) ^^

cashier
25-11-2007, 01:10 PM
Hì . xin lỗi mình nhìn nhầm :D
Nhưng mà bạn ơi, nếu như mình lại không nhầm tiếp :D thì í của bạn là :
- Sắp xếp các số còn lại ( trừ h[k]) theo tăng dần hoặc giảm dần
- Chèn h[k] vào đúng vị trí rồi so sánh nên tăng dần hoặc giảm dần

Nếu đúng như vậy thật thì ví dụ này phải làm sao
1 7 7 8 2 2 1
Với k = 4 -> h[4] =8 phải ở đúng vị trí 4
Vậy đầu tiên ta sắp tăng : 1 1 2 2 7 7 8
hoặc giảm 8 7 7 2 2 1 1
Chèn h[k] -> 1 1 2 8 2 7 7
Hoặc 7 7 2 8 2 1 1
Chọn lấy 1 1 2 8 2 7 7 ( vì Kq1 có khoảng cách = 18 = khoảng cách của kq 2 - > chọn cái nào cũng được )
Tuy nhiên đáp án lại là: 1 2 7 8 7 2 1
vì ở đây khoảng cách chỉ là (2-1) +(7-2) +(8-7) +(8-7)+ ( 7-2) +(2-1) = 14 < 18
Vậy làm thế nào để ra được kết quả như đáp án ???