Đội ôn thi tin học trẻ không chuyên năm 2012

Status
Không mở trả lời sau này.
M

mikelhpdatke

Cho dãy N số tự nhiên tuỳ ý (1\leq N \leq128), hãy chia dãy số đó thành nhiều đoạn nhất có tổng bằng nhau.
Dữ liệu vào từ tệp BAI1.INP có nội dung:
- Dòng đầu tiên ghi số N
- Dòng tiếp theo ghi N số tự nhiên đã cho
Dữ liệu ra là tệp BAI1.out có nội dung:
- Dòng đầu tiên ghi 2 số cách nhau ký tự trống, số thứ nhất là số đoạn chia,số thứ 2 là tổng của các đoạn đã chia.
- Các dòng tiếp theo, mỗi dòng ghi các sô của mỗi đoạn vừa tìm được, các số cách nhau 1 kí tự trống.

Bài này hả a?? E ko hiểu ý anh lắm....................................
 
C

cuong276

Theo như bài anh Quang làm thì các con dốc có độ cao tăng dần đều hặoc giảm dần đều mới được tính là 1 dốc. Còn nhưng dốc xuống hoặc dốc lên có độ tăng hoặc giảm không đều thì không được tính là 1 dốc lên hay 1 dốc xuống.
ví dụ:
1-2-4 thì khoảng cách không đều nên được tính là 2 dốc lên
4-2-1 khoảng cách cũng không đều nên được tính là 2 dốc xuống
còn 20-23-26 khoảng cách đều nhau (3 đơn vị đo) nên được tính là 1 dốc.
Không biết em giải thích cái thuật toán của anh quang như thế có đúng không.
 
Q

quanghero100

Theo như bài anh Quang làm thì các con dốc có độ cao tăng dần đều hặoc giảm dần đều mới được tính là 1 dốc. Còn nhưng dốc xuống hoặc dốc lên có độ tăng hoặc giảm không đều thì không được tính là 1 dốc lên hay 1 dốc xuống.
ví dụ:
1-2-4 thì khoảng cách không đều nên được tính là 2 dốc lên
4-2-1 khoảng cách cũng không đều nên được tính là 2 dốc xuống
còn 20-23-26 khoảng cách đều nhau (3 đơn vị đo) nên được tính là 1 dốc.
Không biết em giải thích cái thuật toán của anh quang như thế có đúng không.

đúng là như thế

mọi người trích cái đề xuống để đọc lại xem sao

:D:D:D
 
Q

quanghero100



Trên 1 đường thẳng ở đồng quê là 1 đường khép kín, do đó là nơi bắt đầu cũng là nơi kết thúc. Độ cao của con đường (Tính theo từng khoảng chiều dài 1 mét) được cho bởi danh sách các độ cao không đổi. Hãy tính số các đường thẳng, số các dốc lên, số các dốc xuống của đường chạy tính từ nơi xuất phát. Một đường thẳng, một dốc lên, một dốc xuống là các đoạn liên tiếp dài nhất, các đoạn bằng lên hay xuống theo hướng chạy.
Dữ liệu vào từ tệp BAI2.INP có nội dung:
- Dòng đầu tiên ghi số N chỉ chiều dài đường chạy [TEX](3\leq N \leq3000)[/TEX]
- Các dòng tiếp theo ghi các độ cao [TEX]H_i[/TEX] [TEX](1\leq i \leq N)[/TEX] của các cột (tính bằng cm) so với mực nước biển [TEX](1\leq H_i \leq 30000)[/TEX]. Mọi giá trị đều là số nguyên dương, mỗi số viết trên 1 dòng.
Dữ liệu ra là tệp BAI2.OUT chứa 3 số nguyên chỉ số đường thẳng bằng, số dốc lên, số dốc xuống theo thứ tự, mỗi số cách nhau 1 kí tự trống.
Ví dụ:
Tệp BAI2.INP
6
20
23
60
50
50
12
Tệp BAI2.OUT
1 2 2

mọi người chứ ý dòng màu đỏ đó một đường thẳng cũng đủ để nói lên tất cả thứ hai là "các đoạn bằng lên hay xuống theo hướng chạy" để đảm bảo không đổi hướng chạy thì phải tăng dần đều hoặc giảm dần đều hoặc bằng nhau
 
C

cuong276

Ha ha ha. Em sửa được bài rồi nè. Bây giờ thì đảm bảo là chạy được.
Mã:
var f,g:text;
    b,c,d,n,i:integer;
    a:array[1..3000]of integer;
begin
     assign(f,'bai2.inp');
     reset(f);
     readln(f,n);
     for i:=1 to n do readln(f,a[i]);
     close(f);
     assign(g,'bai2.out');
     rewrite(g);
     b:=0;
     c:=0;
     d:=0;
     for i:=1 to n-1 do
         begin
              if (a[i+1]-a[i]>=1) and (a[i+2]-a[i+1]>=1) and (a[i+1]-a[i]=a[i+2]-a[i+1]) then dec(c);
              if (a[i+1]-a[i]=0) and (a[i+2]-a[i+1]=0) then dec(b);
              if (a[i]-a[i+1]>=1) and (a[i+1]-a[i+2]>=1) and (a[i]-a[i+1]=a[i+1]-a[i+2]) then dec(d);
              if a[i]<a[i+1] then inc(c);
              if a[i]=a[i+1] then inc(b);
              if a[i]>a[i+1] then inc(d);
         end;
     write(g,b,' ',c,' ',d);
     close(g);
end.
 
C

cuong276



Trên 1 đường thẳng ở đồng quê là 1 đường khép kín, do đó là nơi bắt đầu cũng là nơi kết thúc. Độ cao của con đường (Tính theo từng khoảng chiều dài 1 mét) được cho bởi danh sách các độ cao không đổi. Hãy tính số các đường thẳng, số các dốc lên, số các dốc xuống của đường chạy tính từ nơi xuất phát. Một đường thẳng, một dốc lên, một dốc xuống là các đoạn liên tiếp dài nhất, các đoạn bằng lên hay xuống theo hướng chạy.
Dữ liệu vào từ tệp BAI2.INP có nội dung:
- Dòng đầu tiên ghi số N chỉ chiều dài đường chạy [TEX](3\leq N \leq3000)[/TEX]
- Các dòng tiếp theo ghi các độ cao [TEX]H_i[/TEX] [TEX](1\leq i \leq N)[/TEX] của các cột (tính bằng cm) so với mực nước biển [TEX](1\leq H_i \leq 30000)[/TEX]. Mọi giá trị đều là số nguyên dương, mỗi số viết trên 1 dòng.
Dữ liệu ra là tệp BAI2.OUT chứa 3 số nguyên chỉ số đường thẳng bằng, số dốc lên, số dốc xuống theo thứ tự, mỗi số cách nhau 1 kí tự trống.
Ví dụ:
Tệp BAI2.INP
6
20
23
60
50
50
12
Tệp BAI2.OUT
1 2 2
Từ từ đã. Mọi người xem lại dùm cái đề có đúng không nha. Đường quê này là 1 đường khép kín nên nếu xem a[1] là vị trí bắt đầu thì a[1] cũng phải là vị trí kết thúc chứ nhỉ. Vậy thì ở đây phải so sánh giữa a[n] và a[1] nữa chứ
 
C

cuong276

Còn bài này nữa nè.
Có 2 bài này mọi người cùng giải quyết luôn nha:
Cho dãy N số tự nhiên tuỳ ý [TEX](1\leq N \leq128)[/TEX], hãy chia dãy số đó thành nhiều đoạn nhất có tổng bằng nhau.
Dữ liệu vào từ tệp BAI1.INP có nội dung:
- Dòng đầu tiên ghi số N
- Dòng tiếp theo ghi N số tự nhiên đã cho
Dữ liệu ra là tệp BAI1.out có nội dung:
- Dòng đầu tiên ghi 2 số cách nhau ký tự trống, số thứ nhất là số đoạn chia,số thứ 2 là tổng của các đoạn đã chia.
- Các dòng tiếp theo, mỗi dòng ghi các sô của mỗi đoạn vừa tìm được, các số cách nhau 1 kí tự trống.

Nếu ai chưa làm được thì làm bài này nha
Dãy con lồi
Dãy giá trị nguyên [TEX]A=(A_1,A_2,...,A_n)[/TEX] được gọi là dãy con lồi nếu nó giảm dần từ [TEX]A_1[/TEX] đến một [TEX]A_i[/TEX] nào đó rồi tăng dần đến [TEX]A_n[/TEX]
Ví dụ dãy lồi: 10 5 4 2 - 1 4 6 8 12
Yêu cầu: lập trình nhập vào 1 dãy số nguyên, bằng cách xoá bớt 1 số phần tử của và giữ nguyên trình tự các phần của còn lại, ta nhận được dãy lồi dài nhất.
Dữ: Dayloi.inp có dạng
- Dòng đầu là N ([TEX]N\leq2000[/TEX])
- Dòng tiếp theo là N số nguyên của của dãy số (các số kiểu integer)
Kết quả: Dayloi.out gồm:
- Dòng đầu tiên ghi số phần tử lớn nhất của dãy con tìm được
- Dòng tiếp theo ghi ghi các số thuộc dãy con (không thay đổi trật tự các phần tử trong dãy ban đầu)
 
M

mikelhpdatke

Có 2 bài này mọi người cùng giải quyết luôn nha:
Cho dãy N số tự nhiên tuỳ ý (1\leq N \leq128), hãy chia dãy số đó thành nhiều đoạn nhất có tổng bằng nhau.
Dữ liệu vào từ tệp BAI1.INP có nội dung:
- Dòng đầu tiên ghi số N
- Dòng tiếp theo ghi N số tự nhiên đã cho
Dữ liệu ra là tệp BAI1.out có nội dung:
- Dòng đầu tiên ghi 2 số cách nhau ký tự trống, số thứ nhất là số đoạn chia,số thứ 2 là tổng của các đoạn đã chia.
- Các dòng tiếp theo, mỗi dòng ghi các sô của mỗi đoạn vừa tìm được, các số cách nhau 1 kí tự trống.
Bài này để tớ code cho :))
 
M

mikelhpdatke

Mã:
program chiaso;
 Var d1,d2,a:array[0..10000] Of integer;
   tr:array[0..10000,0..10000] Of integer;
   n,j,i,sum,imax,jmax:integer;
   Procedure PrintResult(jmax,imax:integer);
   Var i,j:integer;
     Begin
       i:=imax;j:=jmax;
       Repeat
          write(a[tr[j,i]],' ');
          j:=j-a[tr[j,i]];
       until j=0;
       writeln;
     end;

 Procedure Init;
 Var i,k:integer;
   Begin
     Readln(n);
     sum:=0;
     For i:=1 to n do
     begin
       readln(A[i]);
      sum:=sum+a[i];
    end;
     FillChar(d1,SizeOf(d1),0);
     FillChar(tr,SizeOf(tr),0);
     d1[0]:=1;
     d2:=d1;

 For i:=1 to n do
  Begin
    For j:=0 to sum-A[i] do
      If d1[j]>=1 then
        Begin
           inc(d2[j+a[i]]);
           tr[j+a[i],d2[j+a[i]]]:=i;
        end;
      d1:=d2;
   end;
  For j:=0 to sum do
    For i:=0 to n do
      IF (tr[j,i]<>0) and (j>0) and (i*j=n) and (i>imax) and (j>jmax)  then
         Begin
             jmax:=j;
             imax:=i;
         end;
  For i:=imax downto 1 do
   Begin
 PrintResult(jmax,i);
   writeln;
   end;
 end;
begin
     Init;
     readln
end.
 
M

mikelhpdatke

Code chạy hơi chậm, để mình xem có cải tiến được ko, cuong276 có cách nào hay ko
 
Q

quanghero100

Mã:
program chiaso;
 Var d1,d2,a:array[0..10000] Of integer;
   tr:array[0..10000,0..10000] Of integer;
   n,j,i,sum,imax,jmax:integer;
   Procedure PrintResult(jmax,imax:integer);
   Var i,j:integer;
     Begin
       i:=imax;j:=jmax;
       Repeat
          write(a[tr[j,i]],' ');
          j:=j-a[tr[j,i]];
       until j=0;
       writeln;
     end;

 Procedure Init;
 Var i,k:integer;
   Begin
     Readln(n);
     sum:=0;
     For i:=1 to n do
     begin
       readln(A[i]);
      sum:=sum+a[i];
    end;
     FillChar(d1,SizeOf(d1),0);
     FillChar(tr,SizeOf(tr),0);
     d1[0]:=1;
     d2:=d1;

 For i:=1 to n do
  Begin
    For j:=0 to sum-A[i] do
      If d1[j]>=1 then
        Begin
           inc(d2[j+a[i]]);
           tr[j+a[i],d2[j+a[i]]]:=i;
        end;
      d1:=d2;
   end;
  For j:=0 to sum do
    For i:=0 to n do
      IF (tr[j,i]<>0) and (j>0) and (i*j=n) and (i>imax) and (j>jmax)  then
         Begin
             jmax:=j;
             imax:=i;
         end;
  For i:=imax downto 1 do
   Begin
 PrintResult(jmax,i);
   writeln;
   end;
 end;
begin
     Init;
     readln
end.
Bài của em viết thì chạy được nhưng hình như chưa đạt yêu cầu thì phải
Ví dụ nha:
với n=6
mảng gồm các phần tử: 1 2 1 2 1 2
thì số đoạn chia được nhiều nhất phải là 3 còn tổng của mỗi đoạn có thể là 1 hoặc 2 hoặc 3
còn chỉ số của mỗi đoạn có thể là:
nếu tổng mỗi đoạn là 1 thì chỉ số các đoạn lần lượt là
1 1 (tức từ phần tử thứ 1 đến phần tử thứ 1)
3 3 (tức từ phần tử thứ 3 đến phần tử thứ 3)
5 5 (.............................5 đến ....................5)
nếu tổng các đoạn bằng 2 thì:
2 2
4 4
6 6
nếu tổng các đoạn bằng 3 thì:
1 2
3 4
5 6
còn với ví dụ:
n=6
các phẩn tử của mảng là: 1 1 1 1 1 1
thì kết quả nhất định phải là:
6 1
1 1
2 2
3 3
4 4
5 5
6 6
anh nghĩ nó phải đạt yêu cầu như thế em xem lại thử nha
 
M

mikelhpdatke

Ủa, nếu nói theo cách của a thì hiểu là: Chia n số thành nhiều đoạn con nhất, ko cần chia hết n số. Cách của e là chia thành nhiều đoạn con nhất ( phải chia hết, ko dư 1 số nào cả).
Tóm lại là đề bài cho hơi mập mờ.
Cho dãy N số tự nhiên tuỳ ý (1 N 128), hãy chia dãy số đó thành nhiều đoạn nhất có tổng bằng nhau.
Dữ liệu vào từ tệp BAI1.INP có nội dung:
- Dòng đầu tiên ghi số N
- Dòng tiếp theo ghi N số tự nhiên đã cho
Dữ liệu ra là tệp BAI1.out có nội dung:
- Dòng đầu tiên ghi 2 số cách nhau ký tự trống, số thứ nhất là số đoạn chia,số thứ 2 là tổng của các đoạn đã chia.
- Các dòng tiếp theo, mỗi dòng ghi các sô của mỗi đoạn vừa tìm được, các số cách nhau 1 kí tự trống.

Nếu chia thành nhiều đoạn, ko cần chia hết thì e chỉ cẩn chỉnh sửa một chút là ok ngay. Nhưng e thắc mắc cái đầu bài. Có cần chia hết n số thành nhiều đoạn ko??
 
Q

quanghero100

Cho dãy N số tự nhiên tuỳ ý (1 N 128), hãy chia dãy số đó thành nhiều đoạn nhất có tổng bằng nhau.
Dữ liệu vào từ tệp BAI1.INP có nội dung:
- Dòng đầu tiên ghi số N
- Dòng tiếp theo ghi N số tự nhiên đã cho
Dữ liệu ra là tệp BAI1.out có nội dung:
- Dòng đầu tiên ghi 2 số cách nhau ký tự trống, số thứ nhất là số đoạn chia,số thứ 2 là tổng của các đoạn đã chia.
- Các dòng tiếp theo, mỗi dòng ghi các sô của mỗi đoạn vừa tìm được, các số cách nhau 1 kí tự trống.
Mã:
uses crt;
var a:array[1..128] of integer;
    F:array[1..100,1..100] of integer;
    n,max,u,v:integer;
procedure input;
var f:text;
    i,j:integer;
begin
   assign(f,'Bai1.inp');
   reset(f);
   readln(f,n);
   for i:=1 to n do
     read(f,a[i]);
   close(f);
end;
function dem(i,t:integer):integer;
var j,k,d:integer;
begin
   d:=0;
   j:=i-1;
   repeat
       k:=0;
       if (k>t) and ((k-a[j])<t) then k:=a[j];
       if k=t then inc(d);
       if k<t then
       repeat
           inc(j);
           k:=k+a[j];
           if k=t then
             begin
                inc(d);
                break;
             end;
       until (k>=t) or (j>=n);


   until j>=n;
   dem:=d;
end;
procedure xuli;
var i,j,t,t2,k,h:integer;
begin
  fillchar(F,sizeof(F),0);
  for i:=1 to n do
     for j:=1 to n-i+1 do
       begin
          t:=0;
          h:=i-1;
          k:=0;
          repeat
              inc(h);
              inc(k);
              t:=t+a[h];
          until k=j;
          F[i,j]:=dem(i,t);
       end;
end;
procedure truyvet;
var i,j,t,k,d,l:integer;
    f1:text;
begin
   assign(f1,'Bai1.out');
   rewrite(f1);
   max:=F[1,1];
   u:=1; v:=1;
   for i:=1 to n do
     begin
        for j:=1 to n do
             if F[i,j]>=max then
                begin
                   max:=F[i,j];
                   u:=i;
                   v:=j;
                end;
     end;
   t:=0;
   i:=u-1;
   d:=0;
   repeat
       inc(i);
       inc(d);
       t:=t+a[i];
   until d=v;
   writeln(f1,max,' ',t);
   i:=u-1;
   repeat
       j:=i;
       inc(i);
       k:=0;
       repeat
           inc(j);
           k:=k+a[j];
       until (k>=t) or (j>=n);
       if k=t then
         begin
           for l:=i to j do
             write(f1,a[l],' ');
           writeln(f1);
         end;
       i:=j;
   until j>=n;
   close(f1);
end;
begin
   input;
   xuli;
   truyvet;
end.
mới vừa làm xong dưới đây là một số test để kiểm tra, hông bik là bị sai gì không mong mọi người chịu khso tạo thêm test để phát hiện lỗi sai nha:) :) :)
test 1:
bai1.inp
5
1 2 4 3 5
bai1.out
2 3
1 2
4 4
test 2:
bai1.inp
7
4 5 7 8 1 6 9
bai1.out
2 7
3 3
5 6
test 3:
bai1.inp
10
9 8 7 5 6 2 1 4 3 6
bai1.out
3 8
2 2
5 6
7 9
test 4:
bai1.inp
15
8 4 5 22 3 4 15 69 75 12 10 11 33 64 2
bai1.out
3 22
4 4
5 7
10 11

Đã chỉnh
 
Last edited by a moderator:
M

mikelhpdatke

Code của e

Mã:
program chiaso;
 Var d1,d2,a:array[0..10000] Of integer;
   tr:array[0..10000,0..10000] Of integer;
   n,j,i,sum,imax,jmax:integer;
   Procedure PrintResult(jmax,imax:integer);
   Var i,j:integer;
     Begin
       i:=imax;j:=jmax;
       Repeat
          write(a[tr[j,i]],' ');
          j:=j-a[tr[j,i]];
       until j=0;
       writeln;
     end;

 Procedure Init;
 Var i,k:integer;
   Begin
     Readln(n);
     sum:=0;
     For i:=1 to n do
     begin
       readln(A[i]);
      sum:=sum+a[i];
    end;
     FillChar(d1,SizeOf(d1),0);
     FillChar(tr,SizeOf(tr),0);
     d1[0]:=1;
     d2:=d1;

 For i:=1 to n do
  Begin
    For j:=0 to sum-A[i] do
      If d1[j]>=1 then
        Begin
           inc(d2[j+a[i]]);
           tr[j+a[i],d2[j+a[i]]]:=i;
        end;
      d1:=d2;
   end;
  For j:=0 to sum do
    For i:=0 to n do
      IF (tr[j,i]<>0) and (j>0)  and (i>imax) and (j>jmax)  then
         Begin
             jmax:=j;
             imax:=i;
         end;
  For i:=imax downto 1 do
   Begin
 PrintResult(jmax,i);
   writeln;
   end;
 end;
begin
     Init;
     readln
end.
 
C

cuong276

Mã:
uses crt;
var a:array[1..128] of integer;
    F:array[1..100,1..100] of integer;
    n,max,u,v:integer;
procedure input;
var f:text;
    i,j:integer;
begin
   assign(f,'Bai1.inp');
   reset(f);
   readln(f,n);
   for i:=1 to n do
     read(f,a[i]);
   close(f);
end;
function dem(i,t:integer):integer;
var j,k,d:integer;
begin
   d:=0;
   j:=i-1;
   repeat
       k:=0;
       if (k>t) and ((k-a[j])<t) then k:=a[j];
       if k=t then inc(d);
       if k<t then
       repeat
           inc(j);
           k:=k+a[j];
           if k=t then
             begin
                inc(d);
                break;
             end;
       until (k>=t) or (j>=n);


   until j>=n;
   dem:=d;
end;
procedure xuli;
var i,j,t,t2,k,h:integer;
begin
  fillchar(F,sizeof(F),0);
  for i:=1 to n do
     for j:=1 to n-i+1 do
       begin
          t:=0;
          h:=i-1;
          k:=0;
          repeat
              inc(h);
              inc(k);
              t:=t+a[h];
          until k=j;
          F[i,j]:=dem(i,t);
       end;
end;
procedure truyvet;
var i,j,t,k,d:integer;
    f1:text;
begin
   assign(f1,'Bai1.out');
   rewrite(f1);
   max:=F[1,1];
   u:=1; v:=1;
   for i:=1 to n do
     begin
        for j:=1 to n do
             if F[i,j]>=max then
                begin
                   max:=F[i,j];
                   u:=i;
                   v:=j;
                end;
     end;
   t:=0;
   i:=u-1;
   d:=0;
   repeat
       inc(i);
       inc(d);
       t:=t+a[i];
   until d=v;
   writeln(f1,max,' ',t);
   i:=u-1;
   repeat
       j:=i;
       inc(i);
       k:=0;
       repeat
           inc(j);
           k:=k+a[j];
       until (k>=t) or (j>=n);
       if k=t then writeln(f1,i,' ',j);
       i:=j;
   until j>=n;
   close(f1);
end;
begin
   input;
   xuli;
   truyvet;
end.
mới vừa làm xong dưới đây là một số test để kiểm tra, hông bik là bị sai gì không mong mọi người chịu khso tạo thêm test để phát hiện lỗi sai nha:) :) :)
test 1:
bai1.inp
5
1 2 4 3 5
bai1.out
2 3
1 2
4 4
test 2:
bai1.inp
7
4 5 7 8 1 6 9
bai1.out
2 7
3 3
5 6
test 3:
bai1.inp
10
9 8 7 5 6 2 1 4 3 6
bai1.out
3 8
2 2
5 6
7 9
test 4:
bai1.inp
15
8 4 5 22 3 4 15 69 75 12 10 11 33 64 2
bai1.out
3 22
4 4
5 7
10 11

Anh ơi bộ text này có vấn đề. Đề ra yêu cầu tệp bai1.out phải có:
-Dòng đầu tiên ghi 2 số cách nhau kí tự trống, số thứ nhất là số đoạn chia, số thứ 2 là tổng các đoạn đã chia
- Các dòng tiếp theo, mỗi dòng ghi các số của mỗi đoạn vừa tìm được, các số cách nhau 1 kí tự trống.
Nhưng mấy bộ text của anh đâu có liệt kê các số ra đâu. Hơn nữa bài này yêu cầu mỗi đoạn có 1 vài số nhưng tất cả số của mảng ban đầu phải được có đầy đủ mà anh. Sao em chỉ thấy 1 vài số thế này
 
C

cuong276

Code của e

Mã:
program chiaso;
 Var d1,d2,a:array[0..10000] Of integer;
   tr:array[0..10000,0..10000] Of integer;
   n,j,i,sum,imax,jmax:integer;
   Procedure PrintResult(jmax,imax:integer);
   Var i,j:integer;
     Begin
       i:=imax;j:=jmax;
       Repeat
          write(a[tr[j,i]],' ');
          j:=j-a[tr[j,i]];
       until j=0;
       writeln;
     end;

 Procedure Init;
 Var i,k:integer;
   Begin
     Readln(n);
     sum:=0;
     For i:=1 to n do
     begin
       readln(A[i]);
      sum:=sum+a[i];
    end;
     FillChar(d1,SizeOf(d1),0);
     FillChar(tr,SizeOf(tr),0);
     d1[0]:=1;
     d2:=d1;

 For i:=1 to n do
  Begin
    For j:=0 to sum-A[i] do
      If d1[j]>=1 then
        Begin
           inc(d2[j+a[i]]);
           tr[j+a[i],d2[j+a[i]]]:=i;
        end;
      d1:=d2;
   end;
  For j:=0 to sum do
    For i:=0 to n do
      IF (tr[j,i]<>0) and (j>0)  and (i>imax) and (j>jmax)  then
         Begin
             jmax:=j;
             imax:=i;
         end;
  For i:=imax downto 1 do
   Begin
 PrintResult(jmax,i);
   writeln;
   end;
 end;
begin
     Init;
     readln
end.

Bộ text của Đạt của có vấn đề, thử bộ text này nha
n=5
dãy a là 1 2 4 3 5
Kết quả của code này chạy là: Vòng lặp không thoát được
 
Q

quanghero100

Anh ơi bộ text này có vấn đề. Đề ra yêu cầu tệp bai1.out phải có:
-Dòng đầu tiên ghi 2 số cách nhau kí tự trống, số thứ nhất là số đoạn chia, số thứ 2 là tổng các đoạn đã chia
- Các dòng tiếp theo, mỗi dòng ghi các số của mỗi đoạn vừa tìm được, các số cách nhau 1 kí tự trống.
Nhưng mấy bộ text của anh đâu có liệt kê các số ra đâu. Hơn nữa bài này yêu cầu mỗi đoạn có 1 vài số nhưng tất cả số của mảng ban đầu phải được có đầy đủ mà anh. Sao em chỉ thấy 1 vài số thế này

À anh đọc nhầm đề ở file out dòng đầu in số đoạn và tổng của mỗi đoạn các dòng tiếp theo in các số của mỗi đoạn thế mà anh cứ tưởng các dòng tiếp theo in vị trị của phần tử đầu và vị trí phần tử cuối của mỗi đoạn việc chỉnh lại cái đó không khó còn việc các đoạn chia ra đảm báo các phần tử của mảng đều đều có mặt cái đề có yêu cầu đâu anh cũng chả thấy nó ghi ở chổ nào cả
 
Status
Không mở trả lời sau này.
Top Bottom