1. Trang chủ
  2. » Trung học cơ sở - phổ thông

BAi tap Pacl ve day con

2 5 0

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

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 2
Dung lượng 16,15 KB

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

Nội dung

Bài 2: Dãy con không giảm dài nhất.. BEGIN clrscr; Nhap; tinh; xuat; END..[r]

Trang 1

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

Trang 2

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, 6, 15, 16, 3, 21 -> Kết quả d = 3 (là dãy 6, 6, 15)

const max=10000;

var A:array[1 max] of longint;

D:array[0 max] of integer;

n,M:integer;

f: text;

procedure nhap;

var i : integer;

begin

assign(f,'MAXSEQ.INP');

reset(f);

readln(f,n);

for i := 1 to n do readln(f,a[i]);

close(f);

fillchar(d,sizeof(d),0);

end;

function chon(s : integer) : boolean;

var x : longint;

begin

s:=2*s;

x:= trunc(sqrt(s));

chon:= sqr(x)+x = s;

end;

procedure tinh;

var i : integer;

begin

if chon(a[1]) then

d[1]:=1

else d[1]:=0;

m:=d[1];

for i:= 2 to n do

if chon(a[i]) then begin

if a[i]>=a[i-1] then d[i]:=d[i-1]+1 else

d[i]:=1;

if d[i]>m then m:=d[i];

end else d[i]:=0;

end;

procedure xuat;

begin assign(f,'MAXSEQ.OUT');

rewrite(f);

write(f,M);

close(f);

end;

BEGIN clrscr;

Nhap;

tinh;

xuat;

END.

Ngày đăng: 16/06/2021, 04:32

TỪ KHÓA LIÊN QUAN

w