-
(Chú ý, chú ý...)HỔ TRỢ TRỰC TUYẾN
Quản trị: Nguyễn Thị Tố Châu(
0914.191.357
)
Chào mừng quý vị đến với Website của Trường THPT Lê Lợi Đông Hà.
Quý vị chưa đăng nhập hoặc chưa đăng ký làm thành viên, vì vậy chưa thể tải được các tư liệu của Thư viện về máy tính của mình.
Nếu chưa đăng ký, hãy đăng ký thành viên tại đây hoặc xem phim hướng dẫn tại đây
Nếu đã đăng ký rồi, quý vị có thể đăng nhập ở ngay ô bên phải.
Dãy con

- 0 / 0
(Tài liệu chưa được thẩm định)
Nguồn: st
Người gửi: Nguyễn Thị Tố Châu (trang riêng)
Ngày gửi: 14h:57' 21-04-2009
Dung lượng: 43.0 KB
Số lượt tải: 85
Nguồn: st
Người gửi: Nguyễn Thị Tố Châu (trang riêng)
Ngày gửi: 14h:57' 21-04-2009
Dung lượng: 43.0 KB
Số lượt tải: 85
Số lượt thích:
0 người
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.
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.
 






Các ý kiến mới nhất