![](https://blog.hocmai.vn/wp-content/uploads/2017/07/hot.gif)
![](https://blog.hocmai.vn/wp-content/uploads/2017/07/hot.gif)
![upload_2019-11-26_16-22-58.png upload_2019-11-26_16-22-58.png](https://diendan.hocmai.vn/data/attachments/137/137523-0d027100f917ad76f38f3fb407344c71.jpg)
![upload_2019-11-26_16-29-12.png upload_2019-11-26_16-29-12.png](https://diendan.hocmai.vn/data/attachments/137/137527-8966ad24c2a1eba7a63e7b18e997e891.jpg)
![upload_2019-11-26_16-28-2.png upload_2019-11-26_16-28-2.png](https://diendan.hocmai.vn/data/attachments/137/137526-b995ad73c28718821fa1471e92d7fb68.jpg)
có thể viết "mã" hoặc ghim file đuôi .pas cũng được
khỏi cần xài file cũng được, cứ readln() writeln() bình thường cũng được, đỡ tốn time :">
Thân ái cám ơn <3 <3 <3
Attachments
Last edited:
Var c:array[1..100] of longint;
i,t,n,ss,s,k,d,j,dd: longint;
Begin
Write('Nhap so cay '); Readln(n);
For i:=1 to n do
Begin
write('c[',i,']=');
Readln(c[i]);
ENd;
For i:=1 to n do s:=s+c[i];
For i:=(n div 2) downto 2 do
Begin
If (s mod i = 0) then
Begin
ss:=s div i;
For j:=1 to n do
Begin
If t<ss then t:=t+c[j];
If t=ss then
Begin
inc(d); t:=0;
If j=n then Begin k:=ss; dd:=d; End;
End;
If t>ss then Begin t:=0; break; end;
End;
End;
If j=n then break;
End;
If d=0 then write(1) else write(dd,' ',k);
Readln;
End.
Program BT1;
Uses crt;
Var n,i,k,j,bienKiemTra,bienThu,bienDem,bienSoLuong : longint;
a : array [1..9999] of integer;
Begin
Write('Hay nhap N : ');Readln(n);
For i:= 1 to n do
Begin
Write('Hay nhap so thu ',i,' : ');Readln(a[i]);
End;
i:=0;
Repeat
Begin
i:=i+1;
bienDem :=1;
bienKiemTra:=0;
bienSoLuong:=0;
For j:=1 to i do bienKiemTra:=bienKiemTra + a[j];
For j:= i+1 to n do
Begin
bienThu:=0;
For k:= i+1 to j do bienThu:= bienThu + a[k];
If bienKiemTra = bienThu then
Begin
bienDem:= bienDem + 1;
i:=j;
Writeln(i);
bienSoLuong := bienSoLuong + (j-k+1);
End;
End;
End;
Until (i=n) or (bienSoLuong = n);
If bienDem =1 then Writeln('1')
Else Write(bienDem,' ',bienKiemTra);
Readln;
End.
Bài 2 : - Mình đang suy nghĩ theo 1 cách như vầy : cộng dồn hết N phần tử lại rồi dùng vòng for downto.. để tìm ra số chia hết cho cái tổng đó, rồi khi phát hiện chia hết thì sẽ tạo 1 vòng for con trong vòng for đó là đi phân chia từng đoạn ra bằng với tổng / chia cho số chia hết đó, nếu phát hiện cả hàng cây nó phân đoạn ra được hết thì break vòng lặp for "lớn" và in ra kết quả có đoạn phân chia đó(và cái gì đó nữa) còn không phát hiện thì tiếp tục cho đến khi i= 2 thì nó out vòng lặp for "lớn" rồi in ra số 1 (1 đây là chỉ phân ra 1 phân đoạn thôi)... tối mình sẽ viết code nếu đúng thì úp lên cũng tham khảo nhé!!Chết mình nhầm, cái này bài 2)))), bạn chủ thớt có làm đc bài 1 k?
cho mình xin phép góp ý xíu nhaaa... là nếu cho vòng lặp chạy từ n div 2 ngược chiều về 2 thì nó sẽ không chính xác 100%, nếu vậy cho nó chạy từ s div 2 mình nghĩ sẽ đúng nhất, mà con set time tối giản nhất nữaĐay là bài 2 nha! Mình không để ý mấy điều kiện khi nhập vào... bạn thêm vào nha! Bạn chạy chương trình xem sao, mình chạy thì đúng rồi đó!
Mã:Var c:array[1..100] of longint; i,t,n,ss,s,k,d,j,dd: longint; Begin Write('Nhap so cay '); Readln(n); For i:=1 to n do Begin write('c[',i,']='); Readln(c[i]); ENd; For i:=1 to n do s:=s+c[i]; For i:=(n div 2) downto 2 do Begin If (s mod i = 0) then Begin ss:=s div i; For j:=1 to n do Begin If t<ss then t:=t+c[j]; If t=ss then Begin inc(d); t:=0; If j=n then Begin k:=ss; dd:=d; End; End; If t>ss then Begin t:=0; break; end; End; End; If j=n then break; End; If d=0 then write(1) else write(dd,' ',k); Readln; End.
1 bài rất hay <3 Liệu bạn với mình có thể kb Facebook để trao đổi với nhau, mình rất thích bộ môn pascal (tin học) và đang ôn thi hsgMình làm bài 1, mình cho chạy thì thấy đúng, còn bạn thì làm như thế nào? Up lên mình tham khảo với !Mã:Program BT1; Uses crt; Var n,i,k,j,bienKiemTra,bienThu,bienDem,bienSoLuong : longint; a : array [1..9999] of integer; Begin Write('Hay nhap N : ');Readln(n); For i:= 1 to n do Begin Write('Hay nhap so thu ',i,' : ');Readln(a[i]); End; i:=0; Repeat Begin i:=i+1; bienDem :=1; bienKiemTra:=0; bienSoLuong:=0; For j:=1 to i do bienKiemTra:=bienKiemTra + a[j]; For j:= i+1 to n do Begin bienThu:=0; For k:= i+1 to j do bienThu:= bienThu + a[k]; If bienKiemTra = bienThu then Begin bienDem:= bienDem + 1; i:=j; Writeln(i); bienSoLuong := bienSoLuong + (j-k+1); End; End; End; Until (i=n) or (bienSoLuong = n); If bienDem =1 then Writeln('1') Else Write(bienDem,' ',bienKiemTra); Readln; End.
Mình nghĩ i chạy từ n div 2 thì tối giản nhất chứ bạn...cho mình xin phép góp ý xíu nhaaa... là nếu cho vòng lặp chạy từ n div 2 ngược chiều về 2 thì nó sẽ không chính xác 100%, nếu vậy cho nó chạy từ s div 2 mình nghĩ sẽ đúng nhất, mà con set time tối giản nhất nữa
mình đang nghĩ đến trường hợp mà tổng của mẳng a lớn hơn rất nhiều so với N thì nó sẽ bị sót số để chia, với lại chưa chắc gì cái phân chia ra bào nhiêu phần nó đã phụ thuộc vào cái tổng mà nó phụ thuộc vào cách đặt vị trí của a nữa,...Mình nghĩ i chạy từ n div 2 thì tối giản nhất chứ bạn...
Trong trường hợp này i là số nhóm dự kiến sẽ chia, n là số phần tử, s là tổng của mảng, mà tổng của mảng thì có thể rất lớn trong khi số phần tử có thể nhỏ hơn nhiều.
Lấy ví dụ tổng = 30, mà số phần tử chỉ = 9, bạn chạy từ s div 2 nghĩa là chạy từ 15... chỉ có 9 cây mà chia sao được 15 nhóm nhỉ? Mình thấy phi lý quá, nếu chạy chương trình như này còn tốn thời gian hơn
À mình hiểu rồi, vậy bạn cho For i:=n-1 downto 2 domình đang nghĩ đến trường hợp mà tổng của mẳng a lớn hơn rất nhiều so với N thì nó sẽ bị sót số để chia, với lại chưa chắc gì cái phân chia ra bào nhiêu phần nó đã phụ thuộc vào cái tổng mà nó phụ thuộc vào cách đặt vị trí của a nữa,...
Bạn hiểu ý mình nói chứ
Đồng chí !!!1 bài rất hay <3 Liệu bạn với mình có thể kb Facebook để trao đổi với nhau, mình rất thích bộ môn pascal (tin học) và đang ôn thi hsg
Mình nghĩ nếu làm theo cách của bạn thì máy tính nó chạy nhanh hơn đó, bạn up lên thử xem, mà nhớ thử với nhiều trường hợp khác nữa nhé, vd như 2 3 2 3 hay 3 4 5 2 chẳng hạnBài 2 : - Mình đang suy nghĩ theo 1 cách như vầy : cộng dồn hết N phần tử lại rồi dùng vòng for downto.. để tìm ra số chia hết cho cái tổng đó, rồi khi phát hiện chia hết thì sẽ tạo 1 vòng for con trong vòng for đó là đi phân chia từng đoạn ra bằng với tổng / chia cho số chia hết đó, nếu phát hiện cả hàng cây nó phân đoạn ra được hết thì break vòng lặp for "lớn" và in ra kết quả có đoạn phân chia đó(và cái gì đó nữa) còn không phát hiện thì tiếp tục cho đến khi i= 2 thì nó out vòng lặp for "lớn" rồi in ra số 1 (1 đây là chỉ phân ra 1 phân đoạn thôi)... tối mình sẽ viết code nếu đúng thì úp lên cũng tham khảo nhé!!
Bài 1 : - chắc để suy nghĩ sau, bạn cũng thử suy nghĩ cũng với mình đi.
function dx(x:string): boolean;
Var i,l: integer;
Begin
dx:=false; i:=1; l:=length(x)+1;
While (x[i]=x[l-i]) and (i<=l div 2) do inc(i);
If i>(l div 2) then dx:=true;
End;
Var s,o:string; i,d:integer;
Begin
Write('Nhap sau ');Readln(s);
For i:=1 to length(s) do
if dx(s) then break
else
Begin
If (s[i]<>s[length(s)-i+1]) and (s[i]=s[length(s)-i]) then
Begin
o:=s[length(s)-i+1];
insert(o,s,i);
inc(d);
End else
If (s[length(s)-i+1]<>s[i]) and (s[length(s)-i+1]=s[i+1]) then
Begin
o:=s[i];
insert(o,s,length(s)-i+2);
inc(d);
End else
If s[i]<>s[length(s)-i+1] then
Begin
o:=s[i];
insert(o,s,length(s)-i+2);
inc(d);
End;
End;
write(d);
Readln;
End.
Cách bạn ấy nói là cách mà mình làm ở trên đó bạn.Mình nghĩ nếu làm theo cách của bạn thì máy tính nó chạy nhanh hơn đó, bạn up lên thử xem, mà nhớ thử với nhiều trường hợp khác nữa nhé, vd như 2 3 2 3 hay 3 4 5 2 chẳng hạn
để mình ví dụ cho dễ hiểu nhé .. nếu s của toàn bộ mảng a có tổng là 120 mà cái N =6 thì ...chẳng hạn đi cái dãy nó chia đều ra 2 phần mỗi phần 60 và cái dãy mảng a nó không thể chia ra theo từng phần khác nữa mà chỉ chia ra 2 phần mỗi phần 60 thôi.... thì nó sẽ bị sót trường hợp đó, mình không nói code bạn sai nhưng nó chưa đúng hoàn toàn nhé !!! thay đổi cái for đầu tiền là " for i:=s div 2 to n do.."À mình hiểu rồi, vậy bạn cho For i:=n-1 downto 2 do
Dù vị trí có đặt như thế nào, tổng có lớn bao nhiêu thì số nhóm chia được nhiều nhất vẫn chỉ bằng n-1 thôi nha.
function dx(x:string): boolean;
Var i,l: integer;
Begin
dx:=false; i:=1; l:=length(x)+1;
While (x[i]=x[l-i]) and (i<=l div 2) do inc(i);
If i>(l div 2) then dx:=true;
End;
Var s,o,ss:string; i,d,dd:integer;
Begin
Write('Nhap sau ');Readln(s); ss:=s;
For i:=1 to length(s) do if dx(s) then break else
Begin
If (s[i]<>s[length(s)-i+1]) and (s[i]=s[length(s)-i]) then
Begin
o:=s[length(s)-i+1];
insert(o,s,i);
inc(d);
End else
If s[i]<>s[length(s)-i+1] then
Begin
o:=s[i];
insert(o,s,length(s)-i+2);
inc(d);
End;
End;
For i:=1 to length(ss) do
if dx(ss) then break
else
Begin
If (ss[length(ss)-i+1]<>ss[i]) and (ss[length(ss)-i+1]=ss[i+1]) then
Begin
o:=ss[i];
insert(o,ss,length(ss)-i+2);
inc(dd);
End else
If ss[i]<>ss[length(ss)-i+1] then
Begin
o:=ss[length(ss)-i+1];
insert(o,ss,i);
inc(dd);
End;
End;
If (dd<d) and (dd>0) then begin d:=dd; s:=ss; end;
write(s,' ',d);
Readln;
End.