# Trung tâm xử lý sự cố > Hỏi-Đáp về Lập trình >  [Pascal] Tìm dãy con liên tiếp dài nhất.

## thanhlong24

ai giúp em giải bài pascal này với, em đang cần gấp.

khai báo mảng a gồm tối đa 100 số nguyên integer; hãy in ra đoạn con tăng dần ( tức là a_ < a[i+1] ) mà có chưa nhiều phần tử nhất.
ví dụ: ta có dãy gồm 10 phần tử:
4 6 10 2 3 5 14 16 5 6
đoạn con cần tìm là : 2 3 5 14 16 ( 2<3<5<14<16)

cảm ơn mọi người nhiều_

----------


## Hongthanhauto

đáng nhẽ là phải ra 2 dãy chứ. vì 4<6<10<14<16 vẫn được.

----------


## seoben

> đáng nhẽ là phải ra 2 dãy chứ. vì 4<6<10<14<16 vẫn được.


 các số đó phải liên tiếp mới được anh, đoạn tăng dần mà anh.

----------


## newgyping

> các số đó phải liên tiếp mới được anh, đoạn tăng dần mà anh.


à, nếu liên tiếp thì đơn giản hơn nhiều. [img]data:image/png;base64,ivborw0kggoaaaansuheugaaaaeaaaabaqmaaaa  l21bkaaaaa1bmvexh5pjm+ykvaaaaaxrstlmaqobyzgaaaapjr  efucndjyaaaaaiaaeihvdmaaaaasuvork5cyii=[/img]

----------


## huahien

> à, nếu liên tiếp thì đơn giản hơn nhiều. [img]data:image/png;base64,ivborw0kggoaaaansuheugaaaaeaaaabaqmaaaa  l21bkaaaaa1bmvexh5pjm+ykvaaaaaxrstlmaqobyzgaaaapjr  efucndjyaaaaaiaaeihvdmaaaaasuvork5cyii=[/img]


vậy giúp em làm đi [img]data:image/png;base64,ivborw0kggoaaaansuheugaaaaeaaaabaqmaaaa  l21bkaaaaa1bmvexh5pjm+ykvaaaaaxrstlmaqobyzgaaaapjr  efucndjyaaaaaiaaeihvdmaaaaasuvork5cyii=[/img]. làm được bài này em mới đủ điểm hs giỏi. thanks anh.

----------


## Hongthanhauto

đầu ra của bài này có thể có nhiều đoạn con. dùng danh sách liên kết đi. duyệt từ đầu mảng số, cứ khi nào tìm đựoc 1 đoạn con thì nhét nó vào 1 nút, đồng thời tìm max là độ dài lớn nhất các đoạn con. sau đó duyệt lại danh sách này, nút nào có đoạn con dài = max thì in ra. cần tớ coding luôn ko , hay tự nghĩ nhé hehe

----------


## chimoiminhem

ai code giùm em bài này lun đi, chứ khó quá, em vẫn không làm được.

----------


## damtuyen232

> ai code giùm em bài này lun đi, chứ khó quá, em vẫn không làm được.


cũng hơi bận nhưng bạn cố gắng đi, trong ngày hôm nay sẽ có code cho bạn. [img]data:image/png;base64,ivborw0kggoaaaansuheugaaaaeaaaabaqmaaaa  l21bkaaaaa1bmvexh5pjm+ykvaaaaaxrstlmaqobyzgaaaapjr  efucndjyaaaaaiaaeihvdmaaaaasuvork5cyii=[/img] 
mình thấy có nhiều người tệ thật, dành thời gian code cho họ rồi chẳng được 1 lời cảm ơn => buồn. vì thế, mong các bạn hãy để ý vấn đề này. người ta giúp thì hãy cảm ơn để chứng tỏ mình là người có văn hóa.

----------


## congthanh2406

> cũng hơi bận nhưng bạn cố gắng đi, trong ngày hôm nay sẽ có code cho bạn. [img]data:image/png;base64,ivborw0kggoaaaansuheugaaaaeaaaabaqmaaaa  l21bkaaaaa1bmvexh5pjm+ykvaaaaaxrstlmaqobyzgaaaapjr  efucndjyaaaaaiaaeihvdmaaaaasuvork5cyii=[/img] 
> mình thấy có nhiều người tệ thật, dành thời gian code cho họ rồi chẳng được 1 lời cảm ơn => buồn. vì thế, mong các bạn hãy để ý vấn đề này. người ta giúp thì hãy cảm ơn để chứng tỏ mình là người có văn hóa.


 cảm ơn anh, code được trong hôm nay thì quá tốt rồi, tại mai em cần.

----------


## khamnamkhoa

xong bài này là thành hs giỏi rồi ^_^ cố lên. à mà hôm qua tớ ngủ quên nên chưa kịp coding, thôi có người code rồi thì thôi

----------


## admin

ai code cũng được hết [img]data:image/png;base64,ivborw0kggoaaaansuheugaaaaeaaaabaqmaaaa  l21bkaaaaa1bmvexh5pjm+ykvaaaaaxrstlmaqobyzgaaaapjr  efucndjyaaaaaiaaeihvdmaaaaasuvork5cyii=[/img], chắc nếu anh happy bận quá thì ai code giùm cũng được.

----------


## Ricky1990

code này mình làm thuật toán duyệt nhé, o(n).


```
const
    finp                = '';
    fout                = '';
    mn                  = 101;
    maxint              = 1 << 31 -1;

var
    fi, fo              : text;
    a                   : array [1..mn] of longint;
    n                   : longint;

procedure readinput;
var i,j,k,t             : longint;
begin
    read(fi, n);
    for i := 1 to n do
        read(fi, a[i]);
    a[n+1] := -maxint;
end;

procedure answer;
var i,j,k,t             : longint;
    longest             : longint;
    rightposition       : longint;
begin
    longest := 0;
    t := 1;
    while (t <= n) do
    begin
        k := t + 1;
        while ( a[k] < a[k+1] ) do
            inc(k);
        if ( longest < k-t+1 ) then
        begin
            longest := k-t+1;
            rightposition := t;
        end;
        t:=k+1;
    end;
    // output
    for t := rightposition to rightposition+longest-1 do
        write(fo, a[t], ' ');
end;

begin
    assign(fi, finp);
    assign(fo, fout);
    reset(fi);
    rewrite(fo);
    readinput;
    answer;
    close(fi);
    close(fo);
end.
```

----------


## duykhoa

hí hí! alan4real học cùng trường tui fải kô (khối 8 nguyễn du). hỏi các bác này giải = ct lớp trên thì đc cái jì? ông lăng đọc cũng kô hỉu [img]data:image/png;base64,ivborw0kggoaaaansuheugaaaaeaaaabaqmaaaa  l21bkaaaaa1bmvexh5pjm+ykvaaaaaxrstlmaqobyzgaaaapjr  efucndjyaaaaaiaaeihvdmaaaaasuvork5cyii=[/img])

----------


## chaydidaubaygio

bài này code bình thường mà . bạn chỉ cần bỏ đi 1 số chi tiết chưa học là đc .

----------


## sanvuonminhanh

trong lập trình không có chuyện lớp trên và lớp dưới, chỉ có chuyện làm được bài hay không làm được bài hay không thôi. nếu bạn đọc code của người khác và hiểu được người đó code những gì thì mình nghĩ bạn cũng học được "cái gì" đó rồi.

nếu bạn đang học lớp 8 thì để mình giải thích một số dòng lệnh mà có thể bạn chưa biết.



```
maxint              = 1 << 31 -1;
```

dòng lệnh trên gán giá trị maxint bằng (2^31 - 1), toán tử << (trong turbo pascal hình như phải viết là "shl" - [shift left]) là phép dịch bit, x << k là dịch toàn bộ các bit của số x trong biểu diễn nhị phân sang bên trái k bit. để mình lấy vd cho dễ hiểu:
1 trong hệ bin (binary - nhị phân) là '1' -> 1 << 1 cho ta '10' (= 2), 1 << 3 cho ta '1000' (= 8)

còn biểu thức: "x >> k" ( ">>" còn viết là "shr" [shift right]) là dịch toàn bộ các bit của số x trong biểu diễn nhị phân sang bên phải k bit. vd:
số 5 trong hệ bin là '101' -> 5 >> 1 = 2 (= '10') , 5 shr 2 = 1 (= '1')

bản chất của biểu thức x << k chính là x * 2^k còn bản chất của biểu thức x >> k chính là x *div* 2^k



```
    finp                = '';
    fout                = '';
--------
    assign(fi, finp);
    assign(fo, fout);
    reset(fi);
    rewrite(fo);
---------
    close(fi);
    close(fo);
```

những dòng trên là những câu lệnh làm việc với file (tệp văn bản), bạn có thể bỏ đi nếu cần, và chương trình vẫn chạy bình thường [img]data:image/png;base64,ivborw0kggoaaaansuheugaaaaeaaaabaqmaaaa  l21bkaaaaa1bmvexh5pjm+ykvaaaaaxrstlmaqobyzgaaaapjr  efucndjyaaaaaiaaeihvdmaaaaasuvork5cyii=[/img]

----------


## seovg

nếu học con trỏ rồi, thì dùng con trỏ cũng được

----------


## trangnt

max int gán = 2^31 -1 làm gì vậy anh trung? sao không lấy maxlongint cho nhanh?
anh trung nói là lớp trên lớp dưới không chia là chưa hợp lí đâu, vì nếu mới lớp 8 đã thạo đồ thị thì chắc fpt tuyển thẳng từ lớp 8 đấy. chỉ khi tới lớp 10, 11, 12 thì mới đúng là chuyện lớp trên lớp dưới không còn rõ ràng, vì hầu như học tới giữa lớp 10 là đã xong các cấu trúc của pascal trong chương trình phổ thông. mà em nghĩ, ai đưa code lên cũng nên đưa kèm thuật toán mới dễ hiểu. mấy bạn ý chưa có kinh nghiệm mấy bài này, nên cho cả thuật toán đi kèm code.
à cái code của anh làm trên gì thế? trong turbo không chạy được code của anh thì phải. mới test thử dòng : 
const maxint = 1 << 31 -1; đã có lỗi ở chỗ << rồi.

----------

