[PASCAL] Giúp mình một bài toán nhỏ :D

Đề 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. :slight_smile:

[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 đó :smiley:

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 đó :slight_smile:

[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ộ.