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

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

(1)Bài 1: Dãy Cho 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 gồm nhiều phần tử dãy đã cho cho tổng các phần tử dãy này chia hết cho k Dữ liệu vào: file văn DAY.INP  Dòng đầu tiên chứa hai số n, k ghi cách ít dấu trống  Các dòng chứa các số A1, A2, , An ghi theo đúng thứ tự cách ít dấu trống xuống dòng (CR-LF) Kết quả: ghi file văn DAY.OUT  Dòng đầu tiên ghi m là số phần tử dãy tìm  Các dòng ghi dãy m số các phần tử dãy đã cho có mặt dãy tìm Các số ghi cách ít dấu trắng 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, maxK - 1] of Byte; n, k, S: Integer; begin for i := to n for t := to k - if B[i - 1, t] < B[i - 1, Subtract(t, a[i])] + then B[i, t] := B[i - 1, t] else B[i, t] := B[i - 1, Subtract(t, a[i])] + 1; end; procedure Enter; var f: Text; i: Integer; begin Assign(f, InputFile); Reset(f); Readln(f, n, k); S := 0; for i := to n begin Read(f, a[i]); a[i] := a[i] mod k; S := (S + a[i]) mod k; end; Close(f); end; procedure Trace; var i, t: Integer; begin FillChar(Mark, SizeOf(Mark), True); t := S; for i := n downto if B[i, t] <> B[i - 1, t] then begin Mark[i] := False; t := Subtract(t, a[i]); end; 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 < then Subtract := a + k else Subtract := a; end; procedure Optimize; var i, t: Integer; procedure Result; var f: Text; i: Integer; begin Assign(f, OutputFile); Rewrite(f); Writeln(f, n - B[n, S]); for i := to n if Mark[i] then Write(f, i, ' '); Close(f); end; begin Enter; Init; Optimize; Trace; Result; End (2) Bài 2: Dãy không giảm dài 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 ≤ i ≤ j ≤ n gọi là dãy không giảm dãy số đã cho Yêu cầu: Trong số các dãy không giảm dãy số đã cho mà các phần tử nó thuộc dãy số {uk} xác định u1=1, un = un-1+k, hãy tìm dãy có độ dài lớn Dữ liệu vào từ file MAXSEQ.INP Dòng đầu chứa số nguyên dương n ≤ 10000 N dòng chứa số nguyên dương ≤ 10^8 (i = n) Kết quả: ghi file văn MAXSEQ.OUT số nguyên d là độ dài dãy không giảm tìm (quy ước không tìm thì ghi d=0) Ví dụ: cho dãy (n=8): 2, 2007, 6, 6, 15, 16, 3, 21 -> Kết d = (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 := to n 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:= to n 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 (3)

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

Xem thêm:

TỪ KHÓA LIÊN QUAN

w