1. Trang chủ
  2. » Giáo án - Bài giảng

Dãy con

4 624 6
Tài liệu đã được kiểm tra trùng lặp

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

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Dãy con
Trường học University of Science
Chuyên ngành Computer Science
Thể loại bài báo
Thành phố Ho Chi Minh City
Định dạng
Số trang 4
Dung lượng 43 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Trang 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;

Trang 2

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

Trang 3

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;

Trang 4

end.

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

Xem thêm

TỪ KHÓA LIÊN QUAN

w