Lập trình Pascal hot đê!!!!!

M

megamanxza

[TẶNG BẠN] TRỌN BỘ Bí kíp học tốt 08 môn
Chắc suất Đại học top - Giữ chỗ ngay!!

ĐĂNG BÀI NGAY để cùng trao đổi với các thành viên siêu nhiệt tình & dễ thương trên diễn đàn.

Cho dãy số tự nhiên a(1), a(2), a(3),...,a(n). Tìm cách chia dãy số trên thành nhiều đoạn nhất sao cho mỗi đoạn có tổng bằng nhau.
Dữ liệu vào: cho vô File INP.BT3 gồm:
-Dòng đầu tiên ghi số n (là số phần tử của dãy)
-Các dòng còn lại ghi các số a(1), a(2), a(3),...,a(n). Các số trên cùng dòng cách nhau một khoảng.

Kết quả: ghi ra File OUT.BT3 gồm k+1 dòng (k là số đoạn được chia nhiều nhất)
-Dòng đầu tiên chứa hai số k và s (s là tổng số giá trị mỗi đoạn).
-k dòng còn lại, mỗi dòng ghi theo thứ tự các số của mỗi đoạn chia được. Các số trên cùng dòng cách nhau một khoảng.
VD:
INP.BT3 gồm:
20
3 5 1 7 8 0 1 2 3 2 10 1 1 1 3 13 0 2 0 1
OUT.BT3 gồm:
4 16
3 5 1 7
8 0 1 2 3 2
10 1 1 1 3
13 0 2 0 1

Các bạn ghi ra một code hoàn chỉnh để mình nghiên cứu nhá! Thanks các bạn nhiều! :)
 
C

cuong276

Bài này tính tổng của dãy số ban đầu (gọi là s đi)
Nếu chia được thì tổng của mỗi dãy phải là ước của s
Xét các ước của s rồi chia các đoạn trên thành các đoạn có tổng bằng ước của s
Ước nào nhiều cách chia hơn thì in ra
 
M

megamanxza

Bài này tính tổng của dãy số ban đầu (gọi là s đi)
Nếu chia được thì tổng của mỗi dãy phải là ước của s
Xét các ước của s rồi chia các đoạn trên thành các đoạn có tổng bằng ước của s
Ước nào nhiều cách chia hơn thì in ra

Nhưng cái khó là làm sao để chia các đoạn trên thành những phần có tổng bằng S?
 
L

lamdetien36

Bạn xem thử thế này có được không ?
Mã:
var
   A, T, Result: array [1..100] of integer;
   N, k, d, i, j, x, y: integer;
   found_result: boolean;
   f: text;
begin
     assign(f, 'INP.BT3');
     reset(f);
     readln(f, N);
     for i := 1 to N do read(f, A[i]);
     close(f);
     T[1] := A[1];
     for i := 2 to N do T[i] := T[i - 1] + A[i];
     assign(f, 'OUT.BT3');
     rewrite(f);
     Result[1] := 1;
     found_result := false;
     for k := 1 to N do
     begin
          Result[2] := k + 1;
          d := T[k] + T[k];
          j := 3;
          for i := k + 1 to N do
          begin
               if T[i] = d then
               begin
                    Result[j] := i + 1;
                    d := d + T[k];
                    if d = T[N] then
                    begin
                         found_result := true;
                         for x := 1 to j - 1 do
                         begin
                              for y := Result[x] to Result[x + 1] - 1 do write(f, A[y], ' ');
                              writeln(f);
                         end;
                         for x := Result[j] to N do write(f, A[x], ' ');
                         break;
                    end;
                    j := j + 1;
               end;
          end;
          if found_result then break;
     end;
     if not found_result then write(f, 'Khong The Chia');
     close(f);
end.
 
T

trinhm838

Bạn xem thử thế này có được không ?
Mã:
var
   A, T, Result: array [1..100] of integer;
   N, k, d, i, j, x, y: integer;
   found_result: boolean;
   f: text;
begin
     assign(f, 'INP.BT3');
     reset(f);
     readln(f, N);
     for i := 1 to N do read(f, A[i]);
     close(f);
     T[1] := A[1];
     for i := 2 to N do T[i] := T[i - 1] + A[i];
     assign(f, 'OUT.BT3');
     rewrite(f);
     Result[1] := 1;
     found_result := false;
     for k := 1 to N do
     begin
          Result[2] := k + 1;
          d := T[k] + T[k];
          j := 3;
          for i := k + 1 to N do
          begin
               if T[i] = d then
               begin
                    Result[j] := i + 1;
                    d := d + T[k];
                    if d = T[N] then
                    begin
                         found_result := true;
                         for x := 1 to j - 1 do
                         begin
                              for y := Result[x] to Result[x + 1] - 1 do write(f, A[y], ' ');
                              writeln(f);
                         end;
                         for x := Result[j] to N do write(f, A[x], ' ');
                         break;
                    end;
                    j := j + 1;
               end;
          end;
          if found_result then break;
     end;
     if not found_result then write(f, 'Khong The Chia');
     close(f);
end.

Bạn giải thích rõ hơn được ko, mình ko hiểu @-) Cũng đang gặp bài này
 
Top Bottom