Bài tập SG về dãy con
Chia sẻ bởi Trần Quang Diệu |
Ngày 26/04/2019 |
55
Chia sẻ tài liệu: Bài tập SG về dãy con thuộc Tin học 11
Nội dung tài liệu:
Bài 1: 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.Bài 2: Dãy con không giảm dài nhất.
Cho dãy số nguyên dương a1, a2,…an. Dãy số ai, ai+1,…aj thoả mãn ai≤ ai+1≤ …≤aj với 1 ≤ i ≤ j ≤ n được gọi là dãy con không giảm của dãy số đã cho. Yêu cầu: Trong số các dãy con không giảm của dãy số đã cho mà các phần tử của nó đều thuộc dãy số {uk} xác định bởi u1=1, un = un-1+k, hãy tìm dãy con có độ dài lớn nhất. Dữ liệu vào từ file MAXSEQ.INP Dòng đầu chứa số nguyên dương n ≤ 10000 N dòng tiếp theo chứa 1 số nguyên dương ai ≤ 10^8 (i = 1..n) Kết quả: ghi ra file văn bản MAXSEQ.OUT số nguyên d là độ dài của dãy con không giảm tìm được (quy ước nếu không tìm được thì ghi d=0). Ví dụ: cho dãy (n=8): 2, 2007, 6,
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.Bài 2: Dãy con không giảm dài nhất.
Cho dãy số nguyên dương a1, a2,…an. Dãy số ai, ai+1,…aj thoả mãn ai≤ ai+1≤ …≤aj với 1 ≤ i ≤ j ≤ n được gọi là dãy con không giảm của dãy số đã cho. Yêu cầu: Trong số các dãy con không giảm của dãy số đã cho mà các phần tử của nó đều thuộc dãy số {uk} xác định bởi u1=1, un = un-1+k, hãy tìm dãy con có độ dài lớn nhất. Dữ liệu vào từ file MAXSEQ.INP Dòng đầu chứa số nguyên dương n ≤ 10000 N dòng tiếp theo chứa 1 số nguyên dương ai ≤ 10^8 (i = 1..n) Kết quả: ghi ra file văn bản MAXSEQ.OUT số nguyên d là độ dài của dãy con không giảm tìm được (quy ước nếu không tìm được thì ghi d=0). Ví dụ: cho dãy (n=8): 2, 2007, 6,
* Một số tài liệu cũ có thể bị lỗi font khi hiển thị do dùng bộ mã không phải Unikey ...
Người chia sẻ: Trần Quang Diệu
Dung lượng: |
Lượt tài: 0
Loại file:
Nguồn : Chưa rõ
(Tài liệu chưa được thẩm định)