Link bài:
Thuật toán:
Ta duyệt các ô trống, nếu ô đó chưa kiểm soát thì ta đánh dấu lại.
Quân xe sẽ kiểm soát các ô từ dòng 1-8 của cột xc và các ô từ cột 1-8 của dòng xd.
Quân tượng sẽ kiểm soát các đường chéo tỏa ra 4 hướng.
Code:
#include <bits/stdc++.h>
using namespace std;
int...
Link bài:
Thuật toán:
Ta bao các cạnh bên ngoài của thành bằng các phần tử mang giá trị 1.
Tường thành là một mảng 2 chiều.
Tạo một chương trình con để di chuyển, khi đụng trúng bờ bao 1 hoặc đụng trúng lớp tường bên ngoài, sẽ lập tức rẽ phải.
Bài này gần tương tự bài VOXO, chỉ khác...
Link bài:
Thuật toán:
Khởi chạy mảng 2 chiều chứa hình xoắn ốc của bài, lấy tọa độ a (i) (j) với i = 101 và j = 101 làm gốc tọa độ.
Dùng chương trình con để chạy từng cạnh một của hình xoắn ốc, ta sẽ khởi tạo từ trong ra ngoài.
Đối với 1 cạnh, hướng đi của ta sẽ thẳng tiến với 1 trục giữ...
Link bài:
Thuật toán:
Dùng một mảng 2 chiều để đánh dấu các ô trên bàn cờ.
Với mỗi quân cờ, ta bắt đầu lan ra theo các hướng đi hợp lệ của nó.
Code:
#include<bits/stdc++.h>
#define fi first
#define se second
#define ii pair <int, int>
#define rep(k, n) for (int i = k; i <= n; i++)
using...
Link bài:
Thuật toán:
Trường hợp k = 1, người chiến thắng sẽ được xác định đơn giản:
Nếu n lẻ, Alice sẽ là người thắng. Bằng không, Bob sẽ thắng.
Trường hợp k > n, Alice sẽ thắng sau một lượt chơi.
Trường hợp n = k, Alice sẽ thắng sau một lượt chơi. Tổng quát với trường hợp (2x+1) *k...
Link bài:
Thuật toán:
Với bài này ta chỉ cần duyệt O (n).
Xét từng phần tử thỏa mãn dãy tăng dần. Nếu gặp phần tử i ≤ phần tử i-1, ta sẽ xét dãy i→n xem liệu đây có là dãy tăng hay không.
Điều kiện ràng buộc rằng phần tử thứ n phải nhỏ hơn phần tử thứ nhất, nếu không thì trong bất cứ...
Link bài:
Thuật toán:
Với bài này, ta sắp xếp các chương trình theo thứ tự lớn dần về thời gian bắt đầu phát sóng.
Dùng 2 vòng for để đếm thủ công.
Code:
#include <bits/stdc++.h>
#define ii pair<int, int>
#define fi first
#define se second
#define rep(k, n) for (int i = k; i <= n; i++)...
Cho dãy n số nguyên không âm a1, a2, an. Người ta tiến hành chọn ra 2 chỉ số i, j sao cho i < j
Và xóa khỏi dãy 2 số ai, aj để tổng giá trị các số còn lại trong dãy là số chẵn.
Yêu cầu: Cho dãy số a1, a2, an. Hãy đếm số lượng cách chọn 2 chỉ số i, j thỏa mãn. Hai cách chọn khác nhau nếu tồn...
Link bài:
Thuật toán:
Đầu tiên, khi trong hàng có 0 con bò (n = 0), ta có 1 cách xếp.
Thống kê số cách xếp i con bò thành hàng (i < n), với trường hợp i ≤ k tức trong hàng chỉ có thể có nhiều nhất 1 con bò đực, số cách sắp chỉ có thể có i con bò trắng và i trường hợp trong đó có 1 con bò...
Link bài:
Thuật toán:
Ta duyệt mảng từ 3 tới n (Vì dãy có tính chất Fibonanci chỉ được xác định với 3 phần tử trở lên và tính chất chỉ có thể xác định khi có ít nhất 3 phần tử).
So sánh và chọn ra độ dài lớn nhất ta tìm được.
Code:
#include <bits/stdc++.h>
using namespace std;
int ans...
Link bài:
Thuật toán:
Nhận xét: Ở trường hợp n = 0, ta chỉ có 1 cách xếp các ô gạch.
Trường hợp n = 1, ta có 3 cách xếp các ô gạch trên.
Gọi số cách điểm xuyết của i ô gạch là ai: Với tường hợp thứ i (i > 1) ta có nhận xét sau:
Nếu ô gạch thứ i-1 có điểm xuyết là 1 0 thì ở ô thứ i, điểm...
Link bài:
Thuật toán:
Mục đích ở đây là sắp xếp các cặp đấu sao cho trường sở tại đạt được số điểm lớn nhất.
Sắp xếp lần lượt số điểm năng lực của 2 đội từ thấp đến cao.
Dùng 2 con trỏ, con trỏ i cho trường đề xuất, con trỏ j cho trường sở tại. Ta sẽ tìm các cặp đấu Ai và Bj sao cho Ai <...
Link bài:
Thuật toán:
Ta sắp xếp dãy người theo thứ tự tăng dần của chiều cao.
Do không có 2 người nào có chiều cao giống nhau, nên ta sẽ dùng chặt nhị phân để giải quyết bài toán (Giảm thời gian tìm kiếm khi chặt nhị phân chỉ cần O (logn) thay vì duyệt hết dãy với O (n).
Duyệt dãy từ 1...
Link bài:
Thuật toán:
Ta dùng thuật toán quay lui để đánh dấu tất lan dần cả các ô mà ốc sên có thể đi đến.
Nếu các ô đó có rau thì ốc sên măm măm rồi đi tiếp.
Code:
#include <bits/stdc++.h>
using namespace std;
int n, m, y, x, ans, a[107][107];
void doit(int i, int j){
if (a[i][j]...
Link bài:
Thuật toán:
Ta dùng quay lui để gọi ra hết các trường hợp có thể xảy ra của chuỗi nhị phân rồi in ra.
Code:
#include<bits/stdc++.h>
using namespace std;
int i, n; int a[1000];
void viet(){
for (int i = 1; i <= n; i++){
cout << a[i];
}
cout << endl;
}
void...
Link bài:
Thuật toán:
Ta sắp xếp các vạch sơn theo thứ tự tăng dần của khoảng các tới đầu sân.
Dùng chặt nhị phân để giảm độ phức tạp khi tìm kiếm vạch chạy xuống O (logn).
Với vạch sân thứ i, ta sẽ tìm kiếm trên đoạn i+1 → n. Do đoạn 1→ i-1 đã được tìm kiếm trước đó.
Code:
#include...
Link bài:
Thuật toán:
Những viên gạch to hơn chắc chắn sẽ đặt được nhiều viên gạch hơn lên trên nó.
Ta sắp xếp các viên gạch theo thứ tự tăng dần về độ cứng.
Chọn lần lượt từng viên gạch kèm theo ràng buộc về độ cứng nhỏ nhất trong chồng gạch được chọn, tránh tình trạng quá tải.
VD...
Link bài:
Thuật toán:
Chạy 2 vòng for, lần lượt dùng một biến "dem" để liệt kê các giá trị của bẳng vào một mảng a.
Sắp xếp mảng a và in ra giá trị thứ k của mảng.
Code:
#include <bits/stdc++.h>
using namespace std;
int dem, a[250007], n, m, k;
int main(){...
Link bài:
Thuật toán:
Ta sẽ vắt các con bò theo thứ tự từ nhiều sữa nhất đến ít sữa nhất.
Nếu vắt những con bò ít sữa hơn thì những con bò nhiều sữa hơn sẽ bị giảm lượng sữa rất nhiều (Tối đa n-1 lít) trong khi nếu để những con bò ít sữa vắt cuối cùng, chúng có hết sữa giữa chừng cũng không...
Link bài:
Thuật toán:
Ta sẽ dùng đệ quy và 2 con trỏ để giải quyết bài này.
Với con trỏ i, j trên 2 mảng a, b nếu a< b[j] ta sẽ in ra "ai" và tiếp tục với i+1, j. Code:
#include <bits/stdc++.h>
using namespace std;
int c[107], b[107], n, m;
void doit(int i, int j){
if (b[i] <= c[j]...
Link bài:
Thuật toán:
Ta dùng thuật toán quay lui để lan đường đi từ viên bi cần di chuyển ra khắp bản đồ. Nếu thuật toán lan được đến viên bi cần tìm, ta sẽ in "YES", không thì in "NO".
Code:
#include <bits/stdc++.h>
using namespace std;
int a[11][11], n, sy, dy, sx, dx;
void doit(int i...
Link bài:
Thuật toán:
Gọi dãy các bạn trai là A và các bạn nữ là B.
Ta sắp xếp các bạn nam và nữ theo thứ tự tăng dần về chiều cao.
Bài này ta sẽ dùng 2 con trỏ. Với cặp A (i) và B (j) thỏa mãn ta sẽ ưu tiên dịch chuyển con trỏ trên dãy A một lượng x đơn vị đến khi gặp A (i+x) > B (j+1)...
Link bài:
Thuật toán:
Để giải một bài có độ khó cao hơn trình độ hiện tại, ta cần hoàn thành các bài có độ khó trong tầm với để tích lũy kinh nghiệm. Con đường trên là duy nhất, điểm kinh nghiệm là vô nghĩa nếu độ khó của bài là quá cao.
Bằng tư duy đó, ta sẽ sắp xếp các bài với độ khó tăng...
Link bài:
Cách 1:
Thuật toán:
Sắp xếp các buổi diễn theo thứ tự tăng dần của giờ bắt đầu.
Ta dùng đệ quy để giải quyết vấn đề.
Với buổi diễn thứ i, ta sẽ tìm buổi diễn thứ j (j < i) thỏa giờ bắt đầu buổi diễn thứ j không được sớm hơn giờ kết thúc buổi diễn thứ i. Lặp lại với buổi diễn...
Link bài:
Cách 1:
Thuật toán:
Sắp xếp các con búp bê lớn dần theo thứ tự kích thước.
Ta dùng các con búp bê lớn nhất để chứa nhiều nhất các con búp bê nhỏ hơn.
Ta có thể dùng thuật toán đệ quy để tính toán (Vì test bài này không quá lớn, nhưng sẽ không phải là cách tối ưu). Mỗi vòng đệ...
Link bài:
Thuật toán:
Do hai ngôi nhà gần nhau nhất chắc chắn sẽ nằm cạnh nhau. Ta sẽ sắp xếp các ngôi nhà theo thứ tựtừ nhỏ đến lớn để dễ dàng tính toán.
Khoảng cách giữa ngôi nhà thứ i và ngôi nhà thứ j tới đầu đường là ai và aj => Khoảng cách giữa hai ngôi nhà i và j là ai-aj (i > j)...
Link bài:
Cách 1:
Thuật toán:
Ta dùng thuật toán sắp xếp dãy n số. Như vậy, các số giống nhau sẽ đứng cạnh nhau.
Đến số lượng các số giống nhau bằng biến "dem", như vậy mỗi khi ai == ai-1, ta sẽ cộng dồn "dem".
Một dãy con có "dem" số giống nhau thì số lượng các cặp sẽ là dem* (dem-1) /2...
Link bài
Thuật toán:
Gọi số lượng lỗ cắm trên ổ cắm thứ i là Ai.
Ta xác định số lượng ổ cắm cần dùng ít nhất bằng cách dùng lần lượt các ổ cắm lớn nhất đến nhỏ nhất.
Xác định thứ tự ổ cắm bằng cách sắp xếp các ổ theo thứ tự từ lớn đến bé
Sau mỗi lần nối thêm ổ cắm thứ i, số lượng lỗ cắm...