Tải bản đầy đủ (.doc) (4 trang)

Dãy con

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (77.77 KB, 4 trang )

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.

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×