HÌNH ẢNH HOẠT ĐỘNG

Tài nguyên dạy học

Thống kê

  • truy cập   (chi tiết)
    trong hôm nay
  • lượt xem
    trong hôm nay
  • thành viên
  • Thành viên trực tuyến

    1 khách và 0 thành viên

    Chào mừng quý vị đến với Website của Trường THPT Lê Lợi Đông Hà.

    Quý vị chưa đăng nhập hoặc chưa đăng ký làm thành viên, vì vậy chưa thể tải được các tư liệu của Thư viện về máy tính của mình.
    Nếu đã đăng ký rồi, quý vị có thể đăng nhập ở ngay ô bên phải.

    Dãy con

    Wait
    • Begin_button
    • Prev_button
    • Play_button
    • Stop_button
    • Next_button
    • End_button
    • 0 / 0
    • Loading_status
    Nhấn vào đây để tải về
    Báo tài liệu có sai sót
    Nhắn tin cho tác giả
    (Tài liệu chưa được thẩm định)
    Nguồn: st
    Người gửi: Nguyễn Thị Tố Châu (trang riêng)
    Ngày gửi: 14h:57' 21-04-2009
    Dung lượng: 43.0 KB
    Số lượt tải: 85
    Số lượt thích: 0 người
    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.
     
    Gửi ý kiến