Dijkstra E. Cho dãy gồm N số nguyên. Tìm đoạn không giảm có chiều dài lớn nhất.
Dữ liệu vào: tệp văn bản MDOAN.INP
Dòng thứ nhất: số tự nhiên N, 1 N 20000. Từ dòng thứ hai trở đi: các phần tử của dãy. Dữ liệu ra: tệp văn bản MDOAN.OUT
Chứa một dòng duy nhất gồm hai số tự nhiên d – chỉ số đầu đoạn và L – số phần tử trong đoạn (chiều dài đoạn).
Trong các tệp, dữ liệu trên cùng dòng cách nhau qua dấu cách.
Thí dụ trên cho ta đoạn không giảm dài nhất bao gồm 7 phần tử bắt đầu từ phần tử thứ tư trong dãy (các phần tử được gạch dưới):
1 5 5 1 3 3 3 5 7 9 1 2
Thuật toán
Đây là bài dễ, ta đọc dần các phần tử từ input file và so sánh hai phần tử liên tiếp nhau là x (phần tử đọc trước tại bước i) và y (phần tử đọc sau tại bước i+1). Nếu y < x thì coi như kết thúc một đọan không giảm, ta cập nhật để ghi nhận lại đoạn không giảm dài nhất. Các biến tổng thể trong chương trình được dùng như sau:
MaxLen – chiều dài của đoạn không giảm dài nhất hiện tìm được, imax - chỉ số đầu tiên của đoạn không giảm dài nhất hiện tìm được, ileft – chỉ số đầu tiên của đoạn không giảm đang xét.
Độ phức tạp: cỡ N.
(* Pascal *)
(**************************************** MDOAN - Doan tang dai nhat MDOAN - Doan tang dai nhat
****************************************) program MDoan; program MDoan; uses crt; const bl = #32; fn = 'MDOAN.INP'; gn = 'MDOAN.OUT'; var f,g: text; MDOAN.INP MDOAN.OUT 12 1 5 5 1 3 3 3 5 7 9 1 2 4 7
n: integer; a: mw1; a: mw1;
iLeft, imax: integer; MaxLen: integer;
procedure Update(i: integer); begin
if (MaxLen < i - iLeft) then begin
MaxLen := i - iLeft;
imax := iLeft; ileft := i; end; iLeft := i; end; procedure XuLi; var i, x, y: integer; begin
assign(f,fn); reset(f); readln(f,n); read(f,x); iLeft := 1; MaxLen := 0; for i := 2 to n do begin read(f,y); if (y < x) then Update(i); x := y; end; Update(n+1); close(f); end; procedure Ghi; begin assign(g,gn); rewrite(g); writeln(g,imax,bl,MaxLen); close(g); end; BEGIN XuLi; ghi; END.
Trong phương án C# dưới đây ta đọc toàn bộ dữ liệu vào một mảng a rồi xử lý trên mảng này.
// C# using System; using System; using System.IO; using System.Collections; namespace SangTao2 { class DoanKhongGiam {
const string fn = "MDoan.inp"; const string gn = "MDoan.out";
static public int n; // n - so phan tu
static public int imax; // chi so dau cua doan max
static public int ileft; // chi so dau cua doan dang xet static public int maxlen; // chieu dai max
static public int [] a;
static void Main(string[] args) { Doc(); XuLi(); Ghi(); XemKetQua(); Console.WriteLine("\n Fini "); Console.ReadLine();
}
static public void XemKetQua(): tự viết static public void XuLi() {
ileft = 0; maxlen = 0; for (int i = 1; i < n; ++i)
if (a[i] < a[i-1]) Update(i); Update(n);
}
static public void Update(int i) { if (maxlen < i - ileft)
{ maxlen = i - ileft; imax = ileft; ileft = i; } }
static public void Doc(): tự viết static public void Ghi() {
File.WriteAllText(gn, imax.ToString() + " " + maxlen.ToString()); } } // DoanKhongGiam
} // SangTao2