1. Trang chủ
  2. » Công Nghệ Thông Tin

Phương pháp thử sai trong lập trình

38 1,3K 2

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 38
Dung lượng 1,04 MB

Nội dung

huyên đề này trình bày phương pháp Thử sai. Cũng như các phương pháp khác như Tham ăn, Chia để trị và Quy hoạch động, đây là chiến lược tổng quát. Phương pháp này chỉ là chiến lược, có tính định hướng tìm thuật toán. Việc áp dụng phương pháp để tìm ra thuật toán cho một bài toán cụ thể còn đòi hỏi nhiều sáng tạo. Trong chuyên đề này, ngoài phần trình bày về phương pháp, chuyên đề còn có những ví dụ cụ thể, cùng với thuật giải và cài đặt, để có cái nhìn chi tiết từ việc thiết kế giải thuật đến xây dựng chương trình. 1. Phương pháp thử sai Trong nhiều bài toán, việc tìm nghiệm có thể quy về việc tìm vector hữu hạn ( ), trong đó (độ dài vector) có thể xác định trước hoặc không. Vector cần tìm phải thỏa mãn một số điều kiện tùy thuộc vào yêu cầu của bài toán. Các thành phần được chọn ra từ tập hữu hạn . Tuỳ vào mục đích bài toán, có thể phải tìm một nghiệm, tìm tất cả nghiệm hoặc đếm số nghiệm. Một suy nghĩ rất tự nhiên để giải quyết bài toán là: lần lượt liệt kê cả các khả năng của nghiệm (theo dạng vector), với mỗi khả năng tiến hành kiểm tra khả năng đó có là nghiệm không? (có thỏa mãn các yêu cầu của bài toán hay không?) Hướng giải quyết như vậy ta gọi là thử sai. Bài toán MẬT KHẨU Một xâu ký tự được gọi là mật khẩu “an toàn” nếu xâu có độ dài ít nhất bằng 6 và xâu chứa ít nhất một chữ cái in hoa ( ), một chữ cái thường ( ), một chữ số ( ). Ví dụ, , là hai mật khẩu “an toàn”, còn đều không phải là mật khẩu “an toàn”. Một lần, Bình nhìn thấy một xâu , chỉ gồm các loại ký tự: chữ cái in hoa, chữ cái thường và chữ số. Bình muốn tự kiểm tra khả năng đoán nhận mật khẩu bằng cách đếm xem có bao nhiêu cặp chỉ số ( ) thỏa mãn điều kiện: ( ) và xâu con gồm các ký tự liên tiếp từ đến của là mật khẩu “an toàn”. Bài toán DÂY DẪN Cho đoạn dây điện ( ). Đoạn dây thứ có độ dài cm ( ). Cần phải cắt các đoạn đã cho thành các đoạn sao cho có được đoạn dây bằng nhau có độ dài nguyên. Có thể không cần cắt hết các đoạn dây đã cho. Mỗi đoạn dây bị cắt có thể có phần còn thừa khác 0. Yêu cầu: Xác định độ dài lớn nhất của đoạn dây có thể nhận được. Nếu không có cách cắt thì đưa ra số 0. Dữ liệu: Vào từ file văn bản WIRES.INP có dạng  Dòng đầu tiên chứa hai số nguyên  Dòng thứ trong dòng sau chứa số nguyên . Kết quả: Đưa ra file văn bản WIRES.OUT, kết quả trên một dòng dưới dạng số nguyên. Ví dụ: Quay lui vét cạn Nếu vector nghiệm đơn giản ta có thể dùng các vòng lặp để liệt kê. Tuy nhiên, trong một số trường hợp vector nghiệm phức tạp thì ta thường liệt kê bằng thủ tục quay lui vét cạn. Xét bài toán 8 quân hậu. Cần đặt 8 quân hậu vào bàn cờ vua , sao cho chúng không tấn công nhau, tức là không có hai quân hậu nào cùng hàng, cùng cột hoặc cùng đường chéo. Ví dụ: hình bên là một cách đặt hậu thỏa mãn yêu cầu bài toán, các ô được tô màu là vị trí đặt hậu. Xác định vector nghiệm: Do các quân hậu phải nằm trên các hàng khác nhau, ta đánh số các quân hậu từ 1 đến 8, quân hậu i là quân hậu nằm trên hàng thứ i (i=1,2,…,8). Gọi là cột mà quân hậu i đứng. Như vậy nghiệm của bài toán là vector ( ), trong đó , tức là được chọn từ tập +. Vector ( ) là nghiệm nếu và hai ô ( ) ( ) không nằm trên cùng một đường chéo. Ví dụ: (1,5,8,6,3,7,2,4) là một nghiệm. Quay lui vét cạn Tư tưởng của phương pháp quay lui vét cạn như sau: Ta xây dựng vector nghiệm dần từng bước, bắt đầu từ vector không ( ). Thành phần đầu tiên được chọn ra từ tập . Giả sử đã chọn được các thành phần thì từ các điều kiện của bài toán ta xác định được tập (các ứng cử viên có thể chọn làm thành phần , là tập con của ). Chọn một phần tử từ ta mở rộng nghiệm được . Lặp lại quá trình trên để tiếp tục mở rộng nghiệm. Nếu không thể chọn được thành phần ( rỗng) thì ta quay lại chọn một phần tử khác của cho . Nếu không còn một phần tử nào khác của ta quay lại chọn một phần tử khác của làm và cứ thế tiếp tục. Trong quá trình mở rộng nghiệm, ta phải kiểm tra nghiệm đang xây dựng đã là nghiệm của bài toán chưa. Nếu chỉ cần tìm một nghiệm thì khi gặp nghiệm ta dừng lại. Còn nếu cần tìm tất cả các nghiệm thì quá trình chỉ dừng lại khi tất cả các khả năng lựa chọn của các thành phần của vector nghiệm đã bị vét cạn. Lược đồ tổng quát của thuật toán quay lui vét cạn c Tổ hợp Một tổ hợp chập k của n là một tập con k phần tử của tập n phần tử. Chẳng hạn tập {1,2,3,4} có các tổ hợp chập 2 là: {1,2}, {1,3, {1,4, {2,3}, {2,4}, {3,4} Vì trong tập hợp các phần tử không phân biệt thứ tự nên tập {1,2} cũng là tập {2,1}, do đó, ta coi chúng chỉ là một tổ hợp. Bài toán: Hãy xác định tất cả các tổ hợp chập k của tập n phần tử . Để đơn giản ta chỉ xét bài toán tìm các tổ hợp của tập các số nguyên từ 1 đến n. Đối với một tập hữu hạn bất kì, bằng cách đánh số thứ tự của các phần tử, ta cũng đưa được về bài toán đối với tập các số nguyên từ 1 đến n. Nghiệm của bài toán tìm các tổ hợp chập k của n phần tử phải thoả mãn các điều kiện sau: Là một vector ( ) lấy giá trị trong tập + Ràng buộc: với mọi giá trị i từ đến (vì tập hợp không phân biệt thứ tự phần tử nên ta sắp xếp các phần tử theo thứ tự tăng dần). Ta có: 1 , do đó tập (tập các ứng cử viên được chọn làm thành phần thứ i) là từ đến ( ). Để điều này đúng cho cả trường hợp , ta thêm vào . Sau đây là chương trình hoàn chỉnh, chương trình sử dụng mô hình đệ quy để sinh tất cả các tổ hợp chập của . Chỉnh hợp không lặp Khác với chỉnh hợp lặp là các thành phần được phép lặp lại (tức là có thể giống nhau), chỉnh hợp không lặp chập k của tập n (k n) phần tử cũng là một dãy k thành phần lấy từ tập n phần tử có xét thứ tự nhưng các thành phần không được phép giống nhau. Ví dụ: Có n người, một cách chọn ra k người để xếp thành một hàng là một chỉnh hợp không lặp chập k của n. Một trường hợp đặc biệt của chỉnh hợp không lặp là hoán vị. Hoán vị của một tập n phần tử là một chỉnh hợp không lặp chập n của n. Nói một cách trực quan thì hoán vị của tập n phần tử là phép thay đổi vị trí của các ph ần tử (do đó mới gọi là hoán vị). Nghiệm của bài toán tìm các chỉnh hợp không lặp chập k của tập n số nguyên từ 1 đến n là các vector thoả mãn các điều kiện:

PHƯƠNG PHÁP THỬ SAI Chuyên đề này trình bày phương pháp Thử sai. Cũng như các phương pháp khác như Tham ăn, Chia để trị và Quy hoạch động, đây là chiến lược tổng quát. Phương pháp này chỉ là chiến lược, có tính định hướng tìm thuật toán. Việc áp dụng phương pháp để tìm ra thuật toán cho một bài toán cụ thể còn đòi hỏi nhiều sáng tạo. Trong chuyên đề này, ngoài phần trình bày về phương pháp, chuyên đề còn có những ví dụ cụ thể, cùng với thuật giải và cài đặt, để có cái nhìn chi tiết từ việc thiết kế giải thuật đến xây dựng chương trình. 1. Phương pháp thử sai Trong nhiều bài toán, việc tìm nghiệm có thể quy về việc tìm vector hữu hạn         , trong đó  (độ dài vector) có thể xác định trước hoặc không. Vector cần tìm phải thỏa mãn một số điều kiện tùy thuộc vào yêu cầu của bài toán. Các thành phần   được chọn ra từ tập hữu hạn   . Tuỳ vào mục đích bài toán, có thể phải tìm một nghiệm, tìm tất cả nghiệm hoặc đếm số nghiệm. Một suy nghĩ rất tự nhiên để giải quyết bài toán là: lần lượt liệt kê cả các khả năng của nghiệm (theo dạng vector), với mỗi khả năng tiến hành kiểm tra khả năng đó có là nghiệm không? (có thỏa mãn các yêu cầu của bài toán hay không?) Hướng giải quyết như vậy ta gọi là thử sai. Ví dụ: Cho dãy số nguyên               và một số nguyên    , thực hiện các yêu cầu sau: 1) Đếm số lượng dãy con liên tiếp của dãy       có số phần tử lớn hơn 3 và tổng các phần tử bằng . 2) Chọn ba phần tử trong dãy mà tích ba phần tử là lớn nhất. 3) Liệt kê tất cả các cách chọn một tập gồm các số trong dãy để tổng các số trong tập được chọn bằng . Phân tích ví dụ: 1) Vector nghiệm của bài toán này là     , trong đó         ) là hai chỉ số của dãy       . Ta có thể thử tất cả các dãy con có độ dài lớn hơn 3 bằng cách thử tất cả các bộ      với     và     , kiểm tra xem        bằng  hay không? 2) Vector nghiệm của bài toán này là       , trong đó             ) là ba chỉ số của dãy       . Ta có thể thử tất cả các bộ ba chỉ số       với        để chọn ba phần tử có lớn nhất. 3) Vector nghiệm của bài toán này là       , trong đó   ,    nếu phần tử thứ  không được chọn vào tập,    nếu phần tử thứ  được chọn vào tập. Ta có thể thử tất cả các dãy       với       , kiểm tra xem         bằng  hay không? Khi giải bài toán bằng phương pháp thử sai chúng ta thường xây dựng: - Xây dựng thủ tục để thực hiện việc liệt kê các khả năng; - Xây dựng hàm để kiểm tra một khả năng có thỏa mãn các điều kiện đề bài hay không? Độ phức tạp của thuật toán theo phương pháp thử sai Dễ dàng thấy được độ phức tạp của thuật toán theo phương pháp thử sai sẽ bằng: số khả năng thử nhân với chi phí trung bình kiểm tra một khả năng. 2. Những vấn đề cần chú ý khi giải bài toán bằng phương pháp thử sai 2.1. Đoán nhận vector nghiệm Để giải bài toán bằng phương pháp thử sai, việc đầu tiên phải làm là phải xác định được vector nghiệm, cụ thể phải xác định: vector nghiệm gồm bao nhiêu thành phần (ý nghĩa mỗi thành phần), miền giá trị của từng thành phần và các ràng buộc giữa các thành phần. Đây là công việc quan trọng mang ý nghĩa quyết định đến việc giải quyết bài toán. 2.2. Giảm thiểu số trường hợp phải thử, giảm thiểu chi phí kiểm tra Quan sát cách tính độ phức tạp thuật toán theo phương pháp thử sai (độ phức tạp của thuật toán theo phương pháp thử sai bằng số khả năng thử nhân với chi phí trung bình kiểm tra một khả năng) ta nhận thấy, để giảm độ phức tạp thuật toán ta có thể giảm thiểu số khả năng phải thử hoặc giảm chi phí kiểm tra. 3. Một số ví dụ minh họa 3.1. Bài toán MẬT KHẨU Một xâu ký tự được gọi là mật khẩu “an toàn” nếu xâu có độ dài ít nhất bằng 6 và xâu chứa ít nhất một chữ cái in hoa , một chữ cái thường , một chữ số . Ví dụ, ,  là hai mật khẩu “an toàn”, còn  đều không phải là mật khẩu “an toàn”. Một lần, Bình nhìn thấy một xâu , chỉ gồm các loại ký tự: chữ cái in hoa, chữ cái thường và chữ số. Bình muốn tự kiểm tra khả năng đoán nhận mật khẩu bằng cách đếm xem có bao nhiêu cặp chỉ số  thỏa mãn điều kiện:   và xâu con gồm các ký tự liên tiếp từ  đến  của  là mật khẩu “an toàn”. Yêu cầu: Cho xâu , tính số lượng cặp chỉ số  thỏa mãn điều kiện nêu trên. Dữ liệu: Vào từ file văn bản MATKHAU.INP gồm một dòng chứa xâu  có độ dài không quá   . Kết quả: Ghi ra file văn bản MATKHAU.OUT một số nguyên là số lượng cặp chỉ số  tính được. Ví dụ: MATKHAU.INP MATKHAU.OUT MATKHAU.INP MATKHAU.OUT abc3456789PQ 6 abc123 0 3.1.1. Lời giải    Xác định vector nghiệm:       trong đó      tương ứng là cặp chỉ số . Xác định ràng buộc: Trong xâu , từ vị trí   đến vị trí   phải xuất hiện chữ in hoa , một chữ cái thường , một chữ số  và      . Để liệt kê tất cả các khả năng ta có thể sử dụng hai vòng lặp lồng nhau, cụ thể thủ tục liệt kê như sau: procedure try; var x1, x2, n :longint; begin n:=length(S); count:=0; for x1:=1 to n do for x2:=1 to n do if isOK(x1,x2) then count:=count+1; end; Trong thủ tục trên, biến S là biến toàn cục, lưu xâu S dữ liệu vào; biến count là biến toàn cục dùng để đếm số lượng cặp thỏa mãn; hàm isOK(x1,x2) nhận hai tham số đầu vào là hai chỉ số của xâu S có nhiệm vụ kiểm tra ràng buộc, trả về TRUE nếu thỏa mãn ràng buộc, FALSE trong trường hợp ngược lại. Trong hàm này ta sẽ phải kiểm tra các điều kiện sau: 1)      ; 2) Từ vị trí   đến vị trí   của xâu S có ký tự thuộc [„A‟ ‟Z‟] 3) Từ vị trí   đến vị trí   của xâu S có ký tự thuộc [„a‟ ‟z‟] 4) Từ vị trí   đến vị trí   của xâu S có ký tự thuộc [„0‟ ‟9‟] Hàm isOK(x1,x2) cụ thể như sau: function isOK(x1,x2:longint):boolean; begin isOK:= (x2-x1>=5) and(checkHAZ(x1,x2)) and(checkLaz(x1,x2)) and(check09(x1,x2)); end; Trong đó hàm checkHAZ(x1,x2) để kiểm tra điều kiện thứ 2 (từ vị trí   đến vị trí   của xâu S có ký tự thuộc [„A‟ ‟Z‟]). Hàm này trả về giá trị TRUE nếu thỏa, FALSE trong trường hợp ngược lại. Tương tự checkLaz(x1,x2) để kiểm tra điều kiện thứ 3, check09(x1,x2) để kiểm tra điều kiện 4. function checkHAZ(x1,x2:longint):boolean; var i : longint; begin for i:=x1 to x2 do if (S[i]>='A')and(S[i]<='Z') then exit(TRUE); exit(FALSE); end; function checklaz(x1,x2:longint):boolean; var i : longint; begin for i:=x1 to x2 do if (S[i]>='a')and(S[i]<='z') then exit(TRUE); exit(FALSE); end; function check09(x1,x2:longint):boolean; var i : longint; begin for i:=x1 to x2 do if (S[i]>='0')and(S[i]<='9') then exit(TRUE); exit(FALSE); end; Tuy nhiên, ta nhận thấy ba hàm kiểm tra trên có thể thu gọn thành hàm check dưới đây. function check(x1,x2:longint; c1,c2:char):boolean; var i : longint; begin for i:=x1 to x2 do if (S[i]>=c1)and(S[i]<=c2) then exit(TRUE); exit(FALSE); end; Chương trình hoàn chỉnh theo cách giải trên const fi ='MATKHAU.INP'; fo ='MATKHAU.OUT'; var S :ansistring; count :int64; function check(x1,x2:longint; c1,c2:char):boolean; var i :longint; begin for i:=x1 to x2 do if (S[i]>=c1)and(S[i]<=c2) then exit(TRUE); exit(FALSE); end; function isOK(x1,x2:longint):boolean; begin isOK:= (check(x1,x2,'A','Z')) and(check(x1,x2,'a','z')) and(check(x1,x2,'0','9')); end; procedure try; var x1, x2, n :longint; begin n:=length(S); count:=0; for x1:=1 to n-5 do for x2:=x1+5 to n do if isOK(x1,x2) then count:=count+1; end; procedure readFile; var f :text; begin assign(f,fi); reset(f); readln(f,S); close(f); end; procedure writeResult; var f :text; begin assign(f,fo); rewrite(f); writeln(f,count); close(f); end; BEGIN readFile; try; writeResult; END. Trong chương trình trên, thủ tục try đã có thay đổi nhằm mục đích chỉ thử các trường hợp mà      , do đó giảm số trường hợp phải thử giảm và trong thủ tục check cũng không cần phải kiểm tra điều kiện      . Độ phức tạp của thuật toán: Số trường hợp phải thử    nhân với chi phí kiểm tra , do đó độ phức tạp thuật toán trên là:   . Chương trình trên biến S thuộc kiểu dữ liệu ansistring (kiểu xâu ký tự cho phép độ dài lớn hơn 255) vì độ dài xâu vào lên tới 10 6 , biến count thuộc kiểu int64 (miền giá trị -2 63 đến 2 63 -1) vì số lượng có thể vượt quá kiểu longint khi độ dài xâu lên tới 10 6 . Kiểu ansistring và int64 là hai kiểu dữ liệu có trong freepascal. 3.1.2. Lời giải    Độ phức tạp của lời giải trên là    với  là độ dài xâu S. Để giảm độ phức tạp thì phải giảm số trường hợp phải thử hoặc giảm chi phí phần kiểm tra. Dễ nhận thấy có thể giảm chi phí kiểm tra theo nhận xét sau: việc kiểm tra      có thể kiểm tra nhanh trong  khi đã kiểm tra      . Như vậy độ phức tạp thuật toán chỉ còn   . 3.1.3. Lời giải  Ta có thể giảm số trường hợp phải thử từ    về  bằng nhận xét sau: nếu      thỏa mãn thì       cũng thỏa mãn, như vậy với mỗi   ta xác định   nhỏ nhất để      thỏa mãn thì      đều thỏa mãn, có       vị trí thỏa mãn cho   . Như vậy chỉ cần thử   , số lượng   thỏa mãn (tương ứng với   ) dễ dàng tính được. Với   cách xác định   như sau:             trong đó   là vị trí nhỏ nhất lớn hơn   mà từ   đến   có xuất hiện ký tự thuộc [„A‟ ‟Z‟], tương tự   là vị trí nhỏ nhất lớn hơn   mà từ   đến   có xuất hiện ký tự thuộc [„a‟ ‟z‟],   là vị trí nhỏ nhất lớn hơn   mà từ   đến   có xuất hiện ký tự thuộc [„0‟ ‟9‟]. Việc xác định       có thể xác định bằng cách chuẩn bị trước. Dưới đây là chương trình hoàn chỉnh. const MAX =1000000; fi ='MATKHAU.INP'; fo ='MATKHAU.OUT'; var next :array[1 MAX,'1' '3']of longint; s :ansistring; n :longint; count :int64; procedure readFile; var f :text; i :longint; c :char; begin assign(f,fi); reset(f); readln(f,s); n:=length(s); close(f); for i:=1 to length(s) do if (s[i]>='0') and (s[i]<='9') then s[i]:='1' else if (s[i]>='a')and(s[i]<='z') then s[i]:='2' else s[i]:='3'; for c:='1' to '3' do next[n,c]:=n+1; next[n,s[n]]:=n; for i:=n-1 downto 1 do begin for c:='1' to '3' do next[i,c]:=next[i+1,c]; next[i,s[i]]:=i; end; end; procedure try; [...]... procedure writeResult; var f :text; begin assign(f,fo); rewrite(f); writeln(f,res); close(f); end; BEGIN readFile; try; writeResult; END Trong chương trình trên, hàm isOK sẽ kiểm tra xem với độ dài có thể có cách cắt được thành đoạn hay không? Chi phí kiểm tra là ( ) Số lượng thử phụ thuộc vào độ dài của các đoạn dây mà độ dài các đoạn dây có thể lên tới 109 3.2.2 Lời giải ( ) Ta có nhận xét sau: nếu độ dài... nằm trên hàng thứ i (i=1,2,…,8) Gọi là cột mà quân hậu i đứng Như vậy nghiệm của bài toán là vector ( ), trong đó + Vector ( * , tức là được chọn từ tập ) là nghiệm nếu và hai ô ( )( ) không nằm trên cùng một đường chéo Ví dụ: (1,5,8,6,3,7,2,4) là một nghiệm 4.1 Quay lui vét cạn Tư tưởng của phương pháp quay lui vét cạn như sau: Ta xây dựng vector nghiệm dần từng bước, bắt đầu từ vector không ( ) Thành... tập con của ) Chọn một phần tử từ ta mở rộng nghiệm Lặp lại quá trình trên để tiếp tục mở rộng nghiệm Nếu không thể chọn được thành phần của (các ứng cử viên có thể chọn làm cho ( rỗng) thì ta quay lại chọn một phần tử khác Nếu không còn một phần tử nào khác của phần tử khác của làm ta quay lại chọn một và cứ thế tiếp tục Trong quá trình mở rộng nghiệm, ta phải kiểm tra nghiệm đang xây dựng đã là... sau: - Là một vector - ( ) lấy giá trị trong tập * - Ràng buộc: + với mọi giá trị i từ đến (vì tập hợp không phân biệt thứ tự phần tử nên ta sắp xếp các phần tử theo thứ tự tăng dần) , do đó tập Ta có: 1 chọn làm thành phần thứ i) là từ cho cả trường hợp , ta thêm vào (tập các ứng cử viên được đến ( ) Để điều này đúng Sau đây là chương trình hoàn chỉnh, chương trình sử dụng mô hình đệ quy để sinh tất... toán tìm các chỉnh hợp không lặp chập k của tập n số nguyên từ 1 đến n là các vector - có k thành phần: - thoả mãn các điều kiện: ( lấy giá trị trong tập * - Ràng buộc: các giá trị ) + đôi một khác nhau, tức là với mọi Sau đây là chương trình hoàn chỉnh, chương trình sử dụng mô hình đệ quy để sinh tất cả các chỉnh hợp không lặp chập của phần tử program ChinhHopKhongLap; const MAX =20; type vector =array[0... ngôn ngữ phổ thông có thể nói hình học Riemann nghiên cứu tính chất các đối tượng hình học xác định trên mặt cầu Trong địa lý, tọa độ một điểm trên mặt cầu thường được xác g vuôn Hình định bằng vĩ độ và kinh độ Nhiều bài toán trong hình 3 2 học Riemann có thể giải bằng các giải thuật áp dụng trong hình học Euclid Để ghi nhận các kết quả nghiên 1 -4 -3 -2 0 -1 1 2 3 4 -2 cứu tìm hiểu Titan (một vệ tinh... trạng thái của đồng xu đó và tất cả các đồng xu nằm ở các ô chung cạnh (úp thành ngửa, ngửa thành úp) Cho trước một trạng thái các đồng xu, hãy lập trình tìm số phép biến đổi ít nhất để đưa về trạng thái tất cả các đồng xu hoặc đều úp hoặc đều ngửa Dữ liệu vào trong file “COIN.INP” có dạng: Gồm 4 dòng, mỗi dòng 4 ký tự „w‟ mô tả trạng thái ngửa hoặc „b‟- mô tả trạng thái úp Kết quả ra file “COIN.OUT”... tiếp xúc) kích thước k × k chiếm trọn một số ô của bảng và nhận tất cả các phần quà trong các ô nằm trong hai hình vuông đó Yêu cầu: Hãy xác định tổng giá trị lớn nhất của các món quà mà Tuấn có thể nhận được Dữ liệu: Vào từ file văn bản BONUS2.INP • Dòng thứ nhất chứa hai số nguyên dương n, k (n ≤ 1000; ) • Dòng thứ i trong số n dòng tiếp theo chứa n số nguyên không âm, số thứ j là aij (aij ≤ 1000)... Dãy số Cho dãy số nguyên Số ( ) được gọi là một số trung ( bình cộng trong dãy nếu tồn tại 3 chỉ số nhau, sao cho ( Yêu cầu: Cho và dãy số ) đôi một khác ) Hãy tìm số lượng các số trung bình cộng trong dãy Dữ liệu vào: - Dòng đầu ghi số nguyên dương - Dòng thứ hai chứa số nguyên ( (| ) | ) Kết quả ra: Số lượng các số trung bình cộng trong dãy Bài 8: WMT Cho bảng số A gồm MxN ô, mỗi ô chứa một số nguyên... n, k(k

Ngày đăng: 23/11/2014, 05:02

TỪ KHÓA LIÊN QUAN

w