PDA

View Full Version : Giúp em bài này với - Olympic Tin



chutieukhocnhe
16-12-2010, 16:24
CHIA NHÓM

Các trường tổ chức cho N học sinh đi cắm trại. Cần chia các học sinh này thành các nhóm không nhất thiết phải có số lượng như nhau, mỗi nhóm một trại. Mỗi nhóm phải có ít nhất một người. Số lượng nhóm và số học sinh trong mỗi nhóm sẽ được thông báo cho nhà tài trợ.

Dựa trên số liệu này, nhà tài trợ sẽ tính toán số lượng tối thiểu chai nước uống để cấp phát sao cho: Mỗi trại đều nhận được số lượng chai nước như nhau; Số lượng các chai nước đó có thể chia đều cho các thành viên của mỗi trại. Các trường muốn tìm cách chia nhóm sao cho mỗi nhóm nhận được nhiều chai nước nhất.

Ví dụ: Với N=5, có 7 cách chia nhóm như sau:

- chia thành năm nhóm: mỗi nhóm có 1 người. Mỗi nhóm nhận được 1 chai nước;

- chia thành bốn nhóm: ba nhóm mỗi nhóm có 1 người, một nhóm có 2 người. Mỗi nhóm nhận được 2 chai nước;

- chia thành ba nhóm: hai nhóm mỗi nhóm có 1 người, một nhóm có 3 người. Mỗi nhóm nhận được 3 chai nước;

- chia thành ba nhóm: một nhóm có 1 người, hai nhóm mỗi nhóm có 2 người. Mỗi nhóm nhận được 2 chai nước;

- chia thành hai nhóm: một nhóm có 1 người, một nhóm có 4 người. Mỗi nhóm nhận được 4 chai nước;

- chia thành hai nhóm: một nhóm có 2 người, một nhóm có 3 người. Mỗi nhóm nhận được 6 chai nước;

- chia thành một nhóm có 5 người. Mỗi nhóm nhận được 5 chai nước.

Vậy 6 là số lượng chai nước nhiều nhất mà mỗi nhóm có thể nhận được.

Yêu cầu: Hãy xác định số lượng chai nước nhiều nhất mà mà mỗi nhóm học sinh có thể nhận được.

Dữ liệu: Cho 10 giá trị của N: 50, 500,1002, 2003, 3005, 4119, 5555, 9050, 15000, 50000.

Kết quả: Ghi ra file văn bản CHIANHOM.OUT gồm 10 dòng, mỗi dòng chứa số lượng chai nước nhiều nhất tìm được tương ứng với một giá trị của N theo trình tự liệt kê trên.
Lưu ý: Thí sinh không phải nộp file chương trình mà chỉ nộp file CHIANHOM.OUT

pvtao
20-12-2010, 08:33
Gọi f(k) là kết quả khi có k học sinh tham gia cắm trại.

+) f(1)=1;
+) f(2)=2;
+) f(3)=3;
+) f(4)=4;
+) f(5)=6;

for i:=1 to n do
if i lẽ then f(i):=f(i div 2)*f(i div 2+1) {VD: f(9)=f(4)*f(5)}
else
f(i)=f(i div 2 - 1)*f(i div 2 + 1); {VD: f(12=f(5)*f(7)}

kq=> f(n).

chutieukhocnhe
20-12-2010, 11:14
Gọi f(k) là kết quả khi có k học sinh tham gia cắm trại.

+) f(1)=1;
+) f(2)=2;
+) f(3)=3;
+) f(4)=4;
+) f(5)=6;

for i:=1 to n do
if i lẽ then f(i):=f(i div 2)*f(i div 2+1) {VD: f(9)=f(4)*f(5)}
else
f(i)=f(i div 2 - 1)*f(i div 2 + 1); {VD: f(12=f(5)*f(7)}

kq=> f(n).

Em chưa hiểu ý tưởng của anh ... ? Anh có thể giải thích thêm được không

pvtao
20-12-2010, 21:38
Bạn vào trang này:

http://alo0781.com/forum/

Mặc dù chưa nổi tiếng lắm nhưng có nhiều "cao thủ" trên đó. Mọi thắc mắc của bạn về lập trình sẽ được giải đáp. (Trên này có những dạng bài tập "mẫu mực" giúp bạn rèn luyện cho các kỳ thi rất tốt, ngoài ra còn có 1 số thành viên đoạt giải quốc gia của các tỉnh và 1 admin theo mình là "bậc thầy"trong lĩnh vực lập trình. bạn sẽ học hỏi được rất nhiều từ diễn đàn này đấy).

À, bài của bạn nếu giải thích cặn kẽ thì dài dòng lắm, mình không có nhiều thời gian, bạn cứ qua diễn đàn mà mình giới thiệu rồi hỏi, sẽ có người trả lời thôi, còn nếu không mình sẽ dành thời gian để giải thích cho bạn.

Mình đã qua thời THPT 2 năm rồi, không biết có lớn hơn bạn không hi.
Nick YM của mình: kazan_kazan2000, nếu bạn "có hứng thú" thì add vào mình sẽ trao đổi về lập trình nhiêu hơn nhé!