Dãy con

4 622 6
Dãy con

Đang tải... (xem toàn văn)

Thông tin tài liệu

Dãy con Cho một dãy gồm n ( n <= 1000) số nguyên dương A1, A2, ., An và số nguyên dương k (k <= 50). Hãy tìm dãy con gồm nhiều phần tử nhất của dãy đã cho sao cho tổng các phần tử của dãy con này chia hết cho k. Dữ liệu vào: file văn bản DAY.INP • •Dòng đầu tiên chứa hai số n, k ghi cách nhau bởi ít nhất 1 dấu trống. • •Các dòng tiếp theo chứa các số A1, A2, ., An được ghi theo đúng thứ tự cách nhau ít nhất một dấu trống hoặc xuống dòng (CR-LF). Kết quả: ghi ra file văn bản DAY.OUT • •Dòng đầu tiên ghi m là số phần tử của dãy con tìm được. • •Các dòng tiếp theo ghi dãy m chỉ số các phần tử của dãy đã cho có mặt trong dãy con tìm được. Các chỉ số ghi cách nhau ít nhất một dấu trắng hoặc một dấu xuống dòng. Ví dụ: program SubSequence; const InputFile = 'SEQ.IN9'; OutputFile = 'SEQ.OU9'; max = 1000; maxK = 50; var a: array[1 max] of Integer; Mark: array[1 max] of Boolean; B: array[0 max, 0 maxK - 1] of Byte; n, k, S: Integer; procedure Enter; var f: Text; i: Integer; begin Assign(f, InputFile); Reset(f); Readln(f, n, k); S := 0; for i := 1 to n do begin Read(f, a[i]); a[i] := a[i] mod k; S := (S + a[i]) mod k; end; Close(f); end; procedure Init; begin FillChar(B[0], SizeOf(B[0]), maxK + 1); B[0, 0] := 0; end; function Subtract(a, b: Integer): Integer; begin a := (a - b) mod k; if a < 0 then Subtract := a + k else Subtract := a; end; procedure Optimize; var i, t: Integer; begin for i := 1 to n do for t := 0 to k - 1 do if B[i - 1, t] < B[i - 1, Subtract(t, a[i])] + 1 then B[i, t] := B[i - 1, t] else B[i, t] := B[i - 1, Subtract(t, a[i])] + 1; end; procedure Trace; var i, t: Integer; begin FillChar(Mark, SizeOf(Mark), True); t := S; for i := n downto 1 do if B[i, t] <> B[i - 1, t] then begin Mark[i] := False; t := Subtract(t, a[i]); end; end; procedure Result; var f: Text; i: Integer; begin Assign(f, OutputFile); Rewrite(f); Writeln(f, n - B[n, S]); for i := 1 to n do if Mark[i] then Write(f, i, ' '); Close(f); end; begin Enter; Init; Optimize; Trace; Result; end. . tiên ghi m là số phần tử của dãy con tìm được. • •Các dòng tiếp theo ghi dãy m chỉ số các phần tử của dãy đã cho có mặt trong dãy con tìm được. Các chỉ số. Dãy con Cho một dãy gồm n ( n <= 1000) số nguyên dương A1, A2, ., An và số nguyên dương k (k <= 50). Hãy tìm dãy con gồm nhiều phần

Ngày đăng: 07/08/2013, 01:25

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan