Đề bài: Cho một dãy n số nguyên nhập từ bàn phím, tìm ra một dãy trong dãy n gồm m phần tử liên tiếp ( m < n) sao cho dãy m phần tử này có tổng là lớn nhất, sau khi tìm đc dãy m ghi ra màn hình các phần tử của nó
ai giúp em với :((
em xin cảm ơn
Cái này thì giống như tìm m phần tử lớn nhất của dãy thôi.
m phần tử này là liên tiếp nhau phải không bạn?
ủa sao bài này e suy nghĩ thấy ngộ nhỉ? ko biết có hiểu sai đề ko? đề nghị bạn vd rõ ràng.
- nếu là dãy liên tiếp: tìm tổng phần tử liên tiếp lớn nhất. ko phải cứ xét 2 phần tử ở bên cuối cùng trái và phải, bên nào lớn hơn thì lấy bên đó cộng các phần tử còn lại là ra dãy dài nhất sao???
vd : 6 2 3 5 7 12 : chọn dãy từ phần tử 2 đến cuối cùng.
-Nếu là dãy ko liên tiếp: cứ tìm phần tử nhỏ nhất loại đi, in ra các phần tử còn lại.
Như vậy dãy tìm đc luôn có số phần tử là m=n-1 (=.=)! vậy thì nó đơn giản qá!
Hix ko biết e nghĩ có sót gì ko??
[QUOTE=11520673;26218]ủa sao bài này e suy nghĩ thấy ngộ nhỉ? ko biết có hiểu sai đề ko? đề nghị bạn vd rõ ràng.
- nếu là dãy liên tiếp: tìm tổng phần tử liên tiếp lớn nhất. ko phải cứ xét 2 phần tử ở bên cuối cùng trái và phải, bên nào lớn hơn thì lấy bên đó cộng các phần tử còn lại là ra dãy dài nhất sao???
vd : 6 2 3 5 7 12 : chọn dãy từ phần tử 2 đến cuối cùng.
-Nếu là dãy ko liên tiếp: cứ tìm phần tử nhỏ nhất loại đi, in ra các phần tử còn lại.
Như vậy dãy tìm đc luôn có số phần tử là m=n-1 (=.=)! vậy thì nó đơn giản qá!
Hix ko biết e nghĩ có sót gì ko??[/QUOTE]
Theo anh thì m, n nhập từ bàn phím, và chuỗi con gồm m phần tử liên tiếp.
VD: n = 9: dãy 4 7 2 9 8 3 1 5 10, m= 4 -> chuỗi cần tìm là 7 2 9 8. ![]()
[QUOTE=11520673;26218]ủa sao bài này e suy nghĩ thấy ngộ nhỉ? ko biết có hiểu sai đề ko? đề nghị bạn vd rõ ràng.
- nếu là dãy liên tiếp: tìm tổng phần tử liên tiếp lớn nhất. ko phải cứ xét 2 phần tử ở bên cuối cùng trái và phải, bên nào lớn hơn thì lấy bên đó cộng các phần tử còn lại là ra dãy dài nhất sao???
vd : 6 2 3 5 7 12 : chọn dãy từ phần tử 2 đến cuối cùng.
-Nếu là dãy ko liên tiếp: cứ tìm phần tử nhỏ nhất loại đi, in ra các phần tử còn lại.
Như vậy dãy tìm đc luôn có số phần tử là m=n-1 (=.=)! vậy thì nó đơn giản qá!
Hix ko biết e nghĩ có sót gì ko??[/QUOTE]
Ý tưởng của em ban đầu anh cũng nghĩ vậy, nhưng mà cái đề bảo là số nguyên => bao gồm cả số âm và số dương => Nếu lấy hết lỡ có trường hợp dãy có nhiều số âm nên làm tổng nhỏ đi…
[QUOTE=08520522;26199]m phần tử này là liên tiếp nhau phải không bạn?[/QUOTE]
uwfh đúng rồi
ý tưởng của em thế này ( mong các anh hoàn thiện giúp)
ban đầu tính tổng dãy m số đầu tiên lấy đó làm max
sau đó tính tổng các dãy m số tiếp theo ( đem so sánh với max nếu nó lớn hơn thì gán max = cái tổng này)
cuối cùng viết ra cái max và các phần tử của nó
giống anh 08520522 ý
m là cho biết trước hay không biết trước ?
[QUOTE=10520108;26190]Cái này thì giống như tìm m phần tử lớn nhất của dãy thôi.[/QUOTE]
đơn giản thế này em đem hỏi làm j =,=
[QUOTE=09520019;26310]m là cho biết trước hay không biết trước ?[/QUOTE]
cái m là mình nhập vào
[QUOTE=dai6cnt;26309]ý tưởng của em thế này ( mong các anh hoàn thiện giúp)
ban đầu tính tổng dãy m số đầu tiên lấy đó làm max
sau đó tính tổng các dãy m số tiếp theo ( đem so sánh với max nếu nó lớn hơn thì gán max = cái tổng này)
cuối cùng viết ra cái max và các phần tử của nó
giống anh 08520522 ý[/QUOTE]
mình thấy ý tưởng bạn đúng roài đó ![]()
uhm, tại đọc đề không kỹ. hihi. Cái này cách làm đại loại là như dai6cnt nói ở trên.
Nhưng mà không cần phải liên tục tính tổng m số hạng như vậy đâu.
Chỉ cần mỗi lần duyệt thì so sánh: nếu (số bớt đi) < (số thêm vào) ==> max= max - (số bớt đi) + (số thêm vào) và lưu vị trí đầu tiên của dãy tạo max này thôi.
[QUOTE=dai6cnt;26309]ý tưởng của em thế này ( mong các anh hoàn thiện giúp)
ban đầu tính tổng dãy m số đầu tiên lấy đó làm max
sau đó tính tổng các dãy m số tiếp theo ( đem so sánh với max nếu nó lớn hơn thì gán max = cái tổng này)
cuối cùng viết ra cái max và các phần tử của nó
giống anh 08520522 ý[/QUOTE]
đúng r còn gì!
theo mình bạn k cần tính tổng m dãy đầu tiên làm max làm j, cứ cho max=0;
for i:=1 to n-m do
begin
dem:=1;
tong:=0;
ptu:=i;
while (dem<=m) and (ptu<=n) do
begin
tong:=tong+a[ptu];
inc(dem);
inc(ptu);
end;
if dem=m then if tong>max then ... {luu vào max moi và luu vi trí phần tử khởi đầu dãy max}
end;
đó là ý tưởng của mình! hy vọng có thể giúp bạn! nếu sai thì nói mình để mình biết với!
[QUOTE=10520108;26326]uhm, tại đọc đề không kỹ. hihi. Cái này cách làm đại loại là như dai6cnt nói ở trên.
Nhưng mà không cần phải liên tục tính tổng m số hạng như vậy đâu.
Chỉ cần mỗi lần duyệt thì so sánh: nếu (số bớt đi) < (số thêm vào) ==> max= max - (số bớt đi) + (số thêm vào) và lưu vị trí đầu tiên của dãy tạo max này thôi.[/QUOTE]
gõ xong đọc lại mới thấy bài của a này.hay hơn cách e =.="
ah làm cách này vậy mình hình dung ra vầy :
for i:=1 to m do max:=max+a*;{tìm dãy đầu tiên từ phần tử 1 đem làm max như bạn nói}
for i:=2 to n-m+1 do if (max-a[i-1]+a[i+m-1]) >max then {luu max moi va luu vi tri i dau tien}
mình còn nhớ kỹ pascal nên ghi dùm bạn luôn code!
[QUOTE=11520673;26439]gõ xong đọc lại mới thấy bài của a này.hay hơn cách e =.="
ah làm cách này vậy mình hình dung ra vầy :
for i:=1 to m do max:=max+a*;{tìm dãy đầu tiên từ phần tử 1 đem làm max như bạn nói}
for i:=2 to n-m+1 do if (max-a[i-1]+a[i+m-1]) >max then {luu max moi va luu vi tri i dau tien}
mình còn nhớ kỹ pascal nên ghi dùm bạn luôn code![/QUOTE]
thks chị cách này có vẻ hợp lý hơn cách của em
thks các anh chị mà em có thêm nhiều ý tưởng
p/s: bài kiểm tra 15ph bọn em đó ![]()
[QUOTE=dai6cnt;26460]thks các anh chị mà em có thêm nhiều ý tưởng
p/s: bài kiểm tra 15ph bọn em đó :)[/QUOTE]
15 phút hả, vậy mần vầy cho gọn
max = 0;
max_i = 0;
for (i = 0; i < n-m; i++){
x = 0;
for (j = i ; j < m; j++)
x = x + a[j];
if (x > max){
max = x;
max_i = i;
}
}
[QUOTE=07520004;26464]15 phút hả, vậy mần vầy cho gọn
max = 0;
max_i = 0;
for (i = 0; i < n-m; i++){
x = 0;
for (j = i ; j < m; j++)
x = x + a[j];
if (x > max){
max = x;
max_i = i;
}
}
[/QUOTE]
hjx hjx! pascal mà sư quynh =.=!
[QUOTE=11520214;26465]hjx hjx! pascal mà sư quynh =.=![/QUOTE]
Thì tự chuyên sang pascal đi chứ chả lẽ anh phải làm toàn bộ.