Trang chủ Tin Học Lớp 9 Trong một buổi cắm trại của lớp, bạn An mua...

Trong một buổi cắm trại của lớp, bạn An mua N thanh gỗ có độ dài mỗi thanh là L. Khi cắm trại, các bạn của An cưa các thanh gỗ ra một cách n

Câu hỏi :

Trong một buổi cắm trại của lớp, bạn An mua N thanh gỗ có độ dài mỗi thanh là L. Khi cắm trại, các bạn của An cưa các thanh gỗ ra một cách ngẫu nhiên (có độ dài là số nguyên). Về sau các bạn có ý định gắn các mẩu con để khôi phục lại các thanh gỗ ban đầu nhưng lại quên mất độ dài L. Họ đã quyết định nối lại các thanh gỗ sao cho chúng có độ dài bằng nhau. Hãy giúp họ chọn cách nối sao cho chúng có độ dài như nhau và càng ngắn càng tốt. Dữ liệu vào: cho trong file văn bản THANHGO.INP: - Dòng đầu ghi số N (N50) là số lượng các mẩu gỗ. - N dòng tiếp theo mỗi dòng ghi số nguyên L i (1  L i  100, 1  i  N) thể hiện độ dài của mẩu gỗ thứ i. Kết quả: Ghi ra file văn bản THANHGO.OUT - Dòng đầu tiên ghi độ dài ngắn nhất tìm được. Trang 2/1 - Trên mỗi dòng ghi số hiệu các mẩu gỗ dùng để ghép thành thanh gỗ đó. Ví dụ: THANHGO.INP THANHGO.OUT 10 2 3 5 2 7 4 6 1 3 3 9 1 2 6 3 8 9 4 5 7 10

Lời giải 1 :

uses crt;
var i,j,n:byte;
    t,tp:word;
    duyet:array[1..100] of boolean;
    a:array[1..100] of byte;
    kq:boolean;
    luu:array[0..100,0..100] of byte;
    f1,f2:text;
const fi='THANHGO.INP';
      fo='THANHGO.OUT';
function check():boolean;
var i:byte;
begin
    for i:=1 to n do
       if duyet[i]=true then exit(false);
    exit(true);
end;
procedure try(ii,p:byte);
var jj:byte;
label 0;
begin
    if tp<i then
       for jj:=ii to n do
          begin
            if duyet[jj]=true then
              if tp+a[jj]<=i then
                  begin
                      inc(tp,a[jj]);
                      duyet[jj]:=false;
                      luu[j,p]:=jj;
                      luu[j,0]:=p;
                      try(jj+1,p+1);
                   if tp=i then goto 0;
                      dec(tp,a[jj]);
                      duyet[jj]:=true;
                   0:
                 end;
          end
    else
       if j=t div i then
          if check()=true then
             kq:=true;
end;
procedure main();
var ii,jj:byte;
begin
    assign(f1,fi);reset(f1);
    assign(f2,fo);rewrite(f2);
    kq:=false;
    readln(f1,n);
    for i:=1 to n do
       begin
           readln(f1,a[i]);
           t:=t+a[i];
       end;
    for i:=1 to t do
      if kq=true then break else
       if t mod i=0 then
          begin
              fillchar(duyet,sizeof(duyet),true);
              j:=0;
              while j<t div i do
                 begin
                     inc(j);
                     tp:=0;
                     try(1,1);
                 end;
          end;
      writeln(f2,i-1);
    for ii:=1 to j do
       begin
           for jj:=1 to luu[ii,0] do write(f2,luu[ii,jj],' ');
           writeln(f2);
       end;
    close(f1);close(f2);
end;
begin
    clrscr;
    main();
end.

Thảo luận

Bạn có biết?

Tin học, tiếng Anh: informatics, tiếng Pháp: informatique, là một ngành khoa học chuyên nghiên cứu quá trình tự động hóa việc tổ chức, lưu trữ, xử lý và truyền dẫn thông tin của một hệ thống máy tính cụ thể hoặc trừu tượng (ảo). Với cách hiểu hiện nay, tin học bao hàm tất cả các nghiên cứu và kỹ thuật có liên quan đến việc mô phỏng, biến đổi và tái tạo thông tin.

Nguồn : Wikipedia - Bách khoa toàn thư

Tâm sự 9

Lớp 9 - Là năm cuối ở cấp trung học cơ sở, sắp phải bước vào một kì thi căng thẳng và sắp chia tay bạn bè, thầy cô và cả kì vọng của phụ huynh ngày càng lớn mang tên "Lên cấp 3". Thật là áp lực nhưng các em hãy cứ tự tin vào bản thân là sẻ vượt qua nhé!

Nguồn : ADMIN :))

Copyright © 2021 HOCTAP247