# Bài 1: Roll die(dice)
3 người bạn lần lượt là Yakko, Wakko và Dot rất thích xem phim. 3 bạn quyết định tung đồng xu để chọn nơi đến của nhóm. Ai cs nhiều điểm nhất thì dc chọn nơi(nếu Yakko hoặc Wakko cs cùng số điểm vs Dot thì sẽ nhường cho Dot thắng).
link bài:https://codeforces.com/problemset/problem/9/A
ảnh ac:(lỡ đặt giá trị là max nên cook lần 1:D )
code:
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int y, w;
cin >> y >> w;
int maxRoll = max(y, w);
int win = 7 - maxRoll;
if (win == 6) {
cout << "1/1" << endl;
} else if (win == 5) {
cout << "5/6" << endl;
} else if (win == 4) {
cout << "2/3" << endl;
} else if (win == 3) {
cout << "1/2" << endl;
} else if (win == 2) {
cout << "1/3" << endl;
} else if (win == 1) {
cout << "1/6" << endl;
}
return 0;
}
Giải thích code:
Do xúc xắc có 6 mặt nên để Dot thắng(win)sẽ là 6-max roll+1= 7-max roll
Dùng if else để in ra phân số số mặt thắng:
vd:
nếu win=3 thì tỷ lệ là 3/6=1/2 nên xuất ra 1/2
# Bài 2: Team
3 ng bạn thân lần lượt là Petya, Vasya và Tonya quyết định lập đội thi lập trình. Họ sẽ chọn ra nhx bài cs 2/3 người biết làm để nộp
link:https://codeforces.com/problemset/problem/231/A
code:
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int count = 0;
for (int i = 0; i < n; ++i) {
int a, b, c;
cin >> a >> b >> c;
if (a + b + c >= 2) {
++count;
}
}
cout << count << endl;
return 0;
}
Giải thích code:
Dùng hàm for:Vòng lặp chạy n lần, mỗi lần đọc 3 số a, b, c.
Kiểm tra: nếu a + b + c >= 2 → nghĩa là ít nhất 2 người biết giải → tăng biến count.
Cuối cùng in ra count.
vd:
Bài 1: tổng = 2 nên làm
Bài 2: tổng = 3 nên làm
Bài 3: tổng = 1 nên bỏ
# Bài 3(ms làm bài 3 mà lười quá:v):Present
Tóm tắt:Peter cs n người bn, cậu ấy muốn biết dc việc 1 người nào đó đã tặng quà cho 1 người nào đó, và hơn hết cậu nhớ rõ cs 1 người bạn i tặng quà cho người bạn cs số Pi.Bây h cậu muốn bt sđt của nhx người đó.
link:https://codeforces.com/problemset/problem/136/A
code:
#include <iostream>
using namespace std;
int main(){
int n;
cin >> n;
int p[101];
int res[101];
for (int i = 1; i <= n; ++i) {
cin >> p[i];
res[p[i]] = i;
}
for (int i = 1; i <= n; ++i) {
cout << res[i] << " ";
}
cout << endl;
return 0;
}
Giải thích code:
int p[101]; Danh sách người mà mỗi bạn đã tặng quà cho.
res[p[i]] = i; Người bạn số i tặng cho p[i], nghĩa là p[i] nhận từ i
cout << res[i] << " "; In người đã tặng quà cho bạn i(cs chừa khoảng trống)
vd:
Bạn 1 tặng cho bạn 2
Bạn 2 tặng cho bạn 3
Bạn 3 tặng cho bạn 4
Bạn 4 tặng cho bạn 1
# Bài 4:Boys or girls
Tóm tắt:Cs rất nhiều người hiện nay sử dụng hình ảnh trái ngược vs giới tính của mình,nên cs 1 ng đã tạo ra phương pháp để phân biệt giới tính của họ.
link:https://codeforces.com/problemset/problem/236/A
code:
#include <iostream>
#include <string>
#include <set>
using namespace std;
int main() {
string username;
cin >> username;
set<char> uniqueLetters;
for (char c : username) {
uniqueLetters.insert(c);
}
if (uniqueLetters.size() % 2 == 0) {
cout << "CHAT WITH HER!" << endl;
} else {
cout << "IGNORE HIM!" << endl;
}
return 0;
}
Giải thích code:
Đọc tên người dùng từ bàn phím.
Dùng set<char> để lưu các chữ cái khác nhau
Đếm số lượng chữ cái khác nhau:
Nếu là số chẵn thì là nữ thì in "CHAT WITH HER!"
Nếu là số lẻ thì là nam thì in "IGNORE HIM!"
VD:
Tên người dùng: "abcde"
Các chữ cái khác nhau: a, b, c, d, e
uniqueLetters.size() = 5
5 % 2 == 1 là lẻ là nam
Tên người dùng: "abab"
Các chữ cái khác nhau: a, b
uniqueLetters.size() = 2
2 % 2 == 0 là chẵn là nữ
# Bài 5:Lucky Ticket
Peyta rất thích vé và những con số may mắn.Số vé may mắn của cậu ta là tổng chữ số ở nửa đầu bằng tổng chữ số ở nửa sau.
link:https://codeforces.com/problemset/problem/146/A
code:
#include <iostream>
using namespace std;
int main() {
int n, a = 0, b = 0;
string s;
cin >> n >> s;
for (int i = 0; i < n; ++i) {
if (s[i] != '4' && s[i] != '7') {
cout << "NO";
return 0;
}
if (i < n / 2) a += s[i] - '0';
else b += s[i] - '0';
}
cout << (a == b ? "YES" : "NO");
return 0;
}
Giải thích code:
gọi n là độ dài của vé(số chẵn)
a là tổng nửa đầu
b là tổng nửa sau
S là chuỗi số
Nếu có ký tự ko phải 4 và 7 sẽ in ra "NO"
Với nửa đầu vé (chỉ số < n/2): cộng vào tổng a
Nửa sau vé: cộng vào tổng b
Dùng toán tử ? : để in kết quả:
Nếu a == b sẽ in "YES"
Ngược lại thì in "NO"
VD:
Tất cả đều là 4 hoặc 7
Tổng nửa đầu = 4+7 = 11
Tổng nửa sau = 7+4 = 11
In "YES"
# Bài 6:Translation
Tóm Tắt:
Vaysa muốn đổi từ tiếng Berland sang Birland chúng được viết (và phát âm) ngược lại.S ở Berland = t ở Birland.
link:https://codeforces.com/problemset/problem/41/A
Code:
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
string s, t;
cin >> s >> t;
reverse(s.begin(), s.end());
if (s == t) {
cout << "YES";
} else {
cout << "NO";
}
return 0;
}
Giải thích code:
Nhập s là từ gốc, t là từ sau khi dịch
dùng reverse để đảo ngược s
vd:nhập: abc, cba
in ra "YES"
# Bài 7:Ball game
Tóm tắt bài:Natalia Pavlovna đã phát minh ra một trò chơi bóng mới, luật chơi là các hs dc đếm số từ 1-n, sau đó ném theo hình vòng tròn. Xác định số trẻ em nhận dc bóng sau mỗi lần ném
link:https://codeforces.com/problemset/problem/46/A
code:
#include <iostream>
using namespace std;
int main()
{
int n, c(2);
cin >> n;
cout << c;
for (int i = 2; i < n; ++i)
{
c += i;
if (c > n)
{
c -= n;
}
cout << " " << c;
}
cout << endl;
return 0;
}
Giải thích code:
Đầu tiên chúng ta cs nhập giá trị n
Vòng lặp từ i = 2 đến i = n - 1
Lặp tổng cộng n - 2 lần (vì bắt đầu từ 2 và kết thúc trước n)
Nếu c vượt quá n, ta đưa nó về lại trong phạm vi 1..n bằng cách trừ đi n
vd:
Khởi đầu c = 2
In: 2
Vòng lặp i = 2:
c = 2 + 2 = 4 sẽ in ra 4
i = 3:
c = 4 + 3 = 7 > 6 thì c = 7 - 6 = 1 sẽ in ra 1
i = 4:
c = 1 + 4 = 5 sẽ in 5
i = 5:
c = 5 + 5 = 10 thì c = 10 - 6 = 4 sẽ in ra 4
# Bài 8:Sleuth
Tóm tắt:
Vaysa chs trò thám tử và muốn tìm ra tội phạm.Nếu chữ cuối là nguyên âm thì sẽ trả lời "YES", còn nguyên âm thì "NO".
link:https://codeforces.com/problemset/problem/49/A
code:
#include <iostream>
using namespace std;
int main() {
string s;
getline(cin, s);
char c;
for (int i = s.size() - 1; ; --i)
if (isalpha(s[i])) {
c = tolower(s[i]);
break;
}
if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' || c == 'y')
cout << "YES";
else
cout << "NO";
return 0;
}
Giải thích code:
Đọc c, nếu chữ cuối cùng của c thuộc phụ âm(a,e,i,o,u,y)
thì in "YES", ngược lại thì in "NO";
vd:
skibidi có chữ cuối là i thì in ra YES
# Bài 9:Easy problem
Cube dc cho 1 số nguyên và cô ấy muốn bt cs bnhieu cặp số nguyên dương tương tự(a,b)
và a = n - b
link:https://codeforces.com/problemset/problem/2044/A
code:
#include <iostream>
using namespace std;
int main() {
int t;
cin >> t;
for (int i = 0; i < t; ++i) {
int n;
cin >> n;
cout << n - 1 << endl;
}
return 0;
}
Giải thích code:
Vòng for chạy t lần
Với mỗi lần lặp, đọc n
In ra n - 1 vì đó là số cặp (a, b) thoả mãn điều kiện là số nguyên dương
vd:
Nếu n = 4 thì b có thể là: 1, 2, 3
(3,1), (2,2), (1,3)
sẽ Có 3 cặp
# Bài 10:Theatre square:
Tóm tắt:Xây quảng trường cs kích thước n x m vs mỗi viên đá cs kích thước a x a. Tính số viên đá cần.
link:https://codeforces.com/problemset/problem/1/A
code:
#include <iostream>
using namespace std;
int main() {
long long n, m, a;
cin >> n >> m >> a;
long long x = (n + a - 1) / a;
long long y = (m + a - 1) / a;
cout << x * y << endl;
return 0;
}
Giải thích code:
tìm x và y theo m và n( làm tròn dạng số nguyên)
x: số viên gạch theo chiều dọc (n)
y: số viên gạch theo chiều ngang (m)
Kết quả = x * y là tổng số viên gạch cần
vd:
Input:
6 6 4
x = (6 + 4 - 1) / 4 = 9 / 4 = 2
y = (6 + 4 - 1) / 4 = 9 / 4 = 2
→ Kết quả: 2 * 2 = 4
Output:
4
# Bài 11:Way Too Long Words
Cs rất nhiều từ quá dài nên nếu từ nào cs trên 10 ký tự sẽ rút gọn lại thành 1 dãy ký tự ngắn hơn.
Link:https://codeforces.com/problemset/problem/71/A
code:
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
while (n--) {
string word;
cin >> word;
if (word.length() > 10) {
cout << word[0] << word.length() - 2 << word.back() << endl;
} else {
cout << word << endl;
}
}
return 0;
}
Giải thích:
Có n từ.
Với mỗi từ:
Nếu dài hơn 10 ký tự → rút gọn thành:
chữ đầu + số ký tự giữa + chữ cuối
Nếu không dài hơn 10 ký tự thì giữ nguyên.
vd:
Input:
3
hello
localization
pneumonoultramicroscopicsilicovolcanoconiosis
Output:
nginx
hello
l10n
p43s
# Bài 12:Domino piling
Tóm tắt đề:Cs 1 bảng hình chữ nhật gồm M x N ô vuông, cs 1 số lượng domino vs kích cỡ 2 x 1.Tìm số domino đặt dc(mỗi quân domino sẽ che phủ hoàn toàn 2 ô vuông, ko cs quân nào chồng lên nhau và nằm hoàn toàn bên trong bàn cờ).
link:https://codeforces.com/problemset/problem/50/A
code:
#include <iostream>
using namespace std;
int main() {
int m, n;
cin >> m >> n;
cout << (m * n) / 2 << endl;
return 0;
}
Giải thích:
(m * n) là tổng số ô trên bảng.
Mỗi domino chiếm 2 ô suy ra chia 2 ra số domino tối đa.
Sử dụng phép chia nguyên (tự động bỏ phần dư).
vd:
Input: 3 3
3 * 3 = 9
9 / 2 = 4 (vì chia lấy nguyên)
Output: 4
# Bài 13:Bit++
Ngôn ngữ bit++, nếu là phép toán ++ sẽ làm tăng 1 giá trị của biến x lên 1, -- thì giàm xuống 1.
link:https://codeforces.com/problemset/problem/282/A
code:
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int x = 0;
while (n--) {
string s;
cin >> s;
if(s.find("+") != string::npos)
x++;
else
x--;
}
cout << x << endl;
return 0;
}
Giải thích:
Tìm "+" hoặc trừ trong x.
Nếu có dấu + (có thể là "X++" hoặc "++X") thì tăng x
Nếu không (tức là "--X" hoặc "X--") thì giảm x
vd:
Input:
3
++X
X--
--X
Output:
-1
# Bài 14:Word Capitalization
Tóm tắt: Viết hoa cho từ đã cho
link:https://codeforces.com/problemset/problem/281/A
code:
#include <iostream>
#include <cctype>
using namespace std;
int main() {
string s;
cin >> s;
if (islower(s[0]))
s[0] = toupper(s[0]);
cout << s << endl;
return 0;
}
Giải thích:
Đọc xem chữ đầu đã viết hoa hay chx
Nếu chưa chuyển chữ đầu thành chữ hoa
vd:
Input: maomao
Output:Maomao
# Bài 15:Bear and Big Brother
Cs 1 chú gấu muốn to lớn hơn anh trai mình nên mỗi năm tăng gấp 3 lần cân nặng, còn anh chú thì tăng gấp 2. Tính số năm cậu cs thể nặng hơn anh trai.
link:https://codeforces.com/problemset/problem/791/A
code:
#include <iostream>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
int years = 0;
while (a <= b) {
a *= 3;
b *= 2;
years++;
}
cout << years << endl;
return 0;
}
Giải thích:
Đọc giá trị a (em) và b (anh).
years = 0: khởi tạo bộ đếm năm.
while (a <= b) nếu em chưa vượt anh:
Limak tăng gấp 3
Bob tăng gấp 2
years++
Khi thoát vòng lặp thì a > b: in years
vd:
Năm 0: a = 4, b = 7
Năm 1: a = 12, b = 14 thì a <= b
Năm 2: a = 36, b = 28 thì a > b, years = 2
Output: 2
# Bài 16:Word
Viết hoa hoặc viết thường chữ cái tùy vào số lượng chữ in hoa hoặc thường.
link:https://codeforces.com/problemset/problem/59/A
code:
#include <iostream>
#include <cctype>
using namespace std;
int main() {
string s;
cin >> s;
int lower = 0, upper = 0;
for (char c : s) {
if (islower(c)) lower++;
else upper++;
}
if (upper > lower) {
for (char &c : s)
c = toupper(c);
} else {
for (char &c : s)
c = tolower(c);
}
cout << s << endl;
return 0;
}
Giải thích:
Duyệt chuỗi để đếm số chữ thường (lower) và chữ hoa (upper).
So sánh:
Nếu upper > lower: chuyển hết thành chữ hoa
Ngược lại: chuyển hết thành chữ thường
vd:
INPUT:
maOmao
KaWAIi
OUTPUT:
maomao
KAWAII
# Bài 17:Elephant
1 con voi muốn đến nhà của bạn và ns cs thể nhảy 1, 2, 3, 4, 5 vị trí. Tính số bước cần nhảy để đến nhà bạn.
link:https://codeforces.com/problemset/problem/617/A
code:
#include <iostream>
using namespace std;
int main() {
int x;
cin >> x;
int steps = (x + 4) / 5;
cout << steps << endl;
return 0;
}
Giải thích:
Để đi nhanh con voi cần đi 5 bước nếu có thể
=> số bước cần đi = quãng đường / 5
sau đó làm tròn.
vd:
Input:
12
Output:
3
2 bước 5 + 1 bước 2, tổng là 12 vậy cần 3 bước
# Bài 18:Stone on the table
Tóm tắt: Cho n viên đá, cs thể cs màu đỏ, xanh lá hoặc xanh lam. Đếm số viên đá lấy ra khỏi bàn sao cho 2 viên đá gần nhau cs màu khác nhau
link:https://codeforces.com/problemset/problem/266/A
code:
#include <iostream>
using namespace std;
int main() {
int n;
string s;
cin >> n >> s;
int count = 0;
for (int i = 1; i < n; ++i) {
if (s[i] == s[i - 1]) {
count++;
}
}
cout << count << endl;
return 0;
}
Giải thích:
Ta cần bỏ ít nhất số viên sao cho không còn hai viên liền kề cùng màu.
🔍 Giải thích từng dòng:
Duyệt qua từng ký tự từ vị trí 1 đến n - 1
Nếu màu hiện tại trùng với màu trước đó, tức là hai viên liền kề trùng màu thì cần bỏ 1 viên.
count++
Đếm số lần có hai viên liền nhau cùng màu đó chính là số viên cần bỏ.
vd:
input:
s = "RRRRGG"
R == R → +1
R == R → +1
R == R → +1
G == G → +1
Output = 4
# Bài 19:Soilders and Bananas
Tóm tắt: Người lính muốn mua 1 số quả chuối, k cho quả đầu và 2k cho quả sau.Anh cs n tiền, hỏi anh phk vay thêm bnhieu để mua w quả chuối
link:https://codeforces.com/problemset/problem/546/A
code:
#include <iostream>
using namespace std;
int main() {
int k, n, w;
cin >> k >> n >> w;
int total = k * w * (w + 1) / 2;
cout << max(0, total - n);
return 0;
}
Giải thích:
Vì chuối sau đắt hơn chuối trước, nên tổng giá tiền = tổng dãy số nhân với k.
Tính số tiền còn thiếu:
total - n: số tiền cần vay.
Dùng max(0, ...) để đảm bảo nếu có đủ tiền rồi thì in ra 0, không phải số âm.
vd:
Input: 3 17 4
Giá từng quả: 3, 6, 9, 12 → Tổng: 30
Có 17 → Thiếu: 30 - 17 = 13
Output: 13
# Bài 20:Foot ball
Peyta ghi lại vị trí của từng cầu thủ lần lượt là 1 và 0(team mình và team bạn).
Nếu cs 7 người cùng số đứng cạnh nhau sẽ dc xem là tình huống nguy hiểm.
link:https://codeforces.com/problemset/problem/96/A
code:
#include <iostream>
using namespace std;
int main() {
string s;
cin >> s;
if (s.find("0000000") != -1 || s.find("1111111") != -1) {
cout << "YES";
} else {
cout << "NO";
}
return 0;
}
Giải thích:
tìm vị trí chuỗi "0000000" trong s. Nếu không thấy, trả về -1
Nếu tìm thấy chuỗi "0000000" hoặc "1111111" thì in "YES".
Ngược lại thì in "NO".
vd:
Input:111110101
Output"NO"
# Bài 21:Beautiful Matrix
Tóm tắt: Có một ma trận kích thước 5×5, gồm 24 số 0 và 1 số 1 duy nhất. Được phép:
Hoán đổi 2 hàng liền kề.
Hoán đổi 2 cột liền kề.
link:https://codeforces.com/problemset/problem/263/A
code:
#include <iostream>
using namespace std;
int main() {
int x;
for (int i = 0; i < 5; ++i)
for (int j = 0; j < 5; ++j) {
cin >> x;
if (x == 1)
cout << abs(i - 2) + abs(j - 2);
}
return 0;
}
Giải thích:
Tìm vị trí của số 1.
Tính số lần cần di chuyển để đưa nó về giữa.
Vì index mảng trong C++ bắt đầu từ 0 nên vị trí giữa là [2][2].
Khi đọc đến ô có giá trị 1, tức là đã tìm được vị trí hiện tại của số 1.
Tính số bước để đưa số 1 về vị trí trung tâm là [2][2] (vì index từ 0).
abs(i - 2) là số bước để đưa về hàng 2.
abs(j - 2) là số bước để đưa về cột 2.
Tổng hai giá trị này chính là số bước cần thiết.
vd:
Input:
0 0 0 0 0
0 0 0 0 0
0 0 0 0 1
0 0 0 0 0
0 0 0 0 0
Output:
2
# Bài 22:Next Round
Tóm tắt:Có n người tham gia cuộc thi, mỗi người có một số điểm.
Người được vào vòng tiếp theo là người có điểm không nhỏ hơn người xếp thứ k (tức là điểm ≥ điểm của người đứng thứ k), và điểm phải lớn hơn 0.
link:https://codeforces.com/problemset/problem/158/A
code:
#include <iostream>
using namespace std;
int main() {
int n, k, a[50], count = 0;
cin >> n >> k;
for (int i = 0; i < n; ++i)
cin >> a[i];
for (int i = 0; i < n; ++i)
if (a[i] >= a[k - 1] && a[i] > 0)
count++;
cout << count;
return 0;
}
Giải thích:
a[k-1]: điểm người đứng thứ k (do mảng bắt đầu từ 0).
Duyệt tất cả điểm:
Nếu điểm ≥ a[k-1] và lớn hơn 0 thì được tính.
Cuối cùng in ra count.
vd:
Input:
10 1
0 0 0 0 0 0 0 0 0 0
Người đầu tiên có điểm = 0
=> không ai có điểm > 0
Output:
0
# Bài 23: Petya and Strings
Tóm tắt:CHo hai chuỗi chỉ gồm chữ cái Latin (hoa hoặc thường).
Nhiệm vụ
So sánh hai chuỗi theo thứ tự từ điển, nhưng không phân biệt chữ hoa thường.
link:https://codeforces.com/problemset/problem/112/A
code:
#include <iostream>
#include<algorithm>
#include<cc type>
using namespace std;
int main(){
string a, b;
cin >> a >> b;
transform(a.begin(), a.end(), a.begin(), ::tolower);
transform(b.begin(), b.end(), b.begin(), ::tolower);
if(a < b){
cout << -1;
}
else if(a > b){
cout << 1;
}
else{
cout << 0;
}
return 0;
}
Giải thích:
Chuyển tất cả ký tự trong chuỗi thành chữ thường để so sánh không phân biệt hoa thường.
Nếu a đứng trước b theo thứ tự từ điển thì in -1
Nếu a đứng sau b thì in 1
Nếu giống nhau thì in 0
vd:
Input:
apple
ApPle
Output:
0
# Bài 24:String Task
Tóm tắt:
Cho một chuỗi chỉ gồm chữ cái Latin, cả hoa và thường.
Nhiệm vụ: Biến đổi chuỗi thành 1 dạng mới
Tất cả ký tự trong kết quả phải là chữ thường
link:https://codeforces.com/problemset/problem/118/A
code:
#include <iostream>
#include <cctype>
using namespace std;
int main() {
string s;
cin >> s;
for (char c : s) {
c = tolower(c);
if (c != 'a' && c != 'o' && c != 'y' && c != 'e' && c != 'u' && c != 'i') {
cout << '.' << c;
}
}
return 0;
}
Giải thích:
Bỏ hết nguyên âm (a, o, y, e, u, i) – không phân biệt hoa thường
Trước mỗi phụ âm còn lại, thêm một dấu .
In kết quả toàn bằng chữ thường
vd:
Input:
aBAcAba
Output:
.b.c.b
# Bài 25:Wrong Subtraction
Tóm tắt:
Bạn được cho một số nguyên n và một số lần thao tác k.
Mỗi lần thao tác:
Nếu chữ số cuối của n là khác 0 thì giảm n đi 1.
Nếu chữ số cuối là 0 thì chia n cho 10.
Sau k lần thao tác, in ra giá trị cuối cùng của n.
link:https://codeforces.com/problemset/problem/977/A
code:
#include <iostream>
using namespace std;
int main() {
int n, k;
cin >> n >> k;
while (k--) {
if (n % 10 == 0)
n /= 10;
else
n -= 1;
}
cout << n;
return 0;
}
Giải thích:
Nhập n và k
Lặp k lần:
Nếu chữ số cuối của n là 0
nghĩa là n chia hết cho 10 => chia n cho 10
Nếu chữ số cuối khác 0 ta chỉ cần giảm n đi 1
vd:
Input:
1000 3
Output: 1
# Bài 27:Young Physicist
Tóm tắt:
Một sinh viên vật lý đang làm bài toán về các lực trong không gian 3 chiều (x, y, z).
Bạn được cho n vector lực – mỗi vector có 3 thành phần (x, y, z).
Hỏi: Tổng của tất cả các vector có bằng (0, 0, 0) không?
link:https://codeforces.com/problemset/problem/69/A
code:
#include <iostream>
using namespace std;
int main(){
int n, x, y, z;
cin >> n;
int sumX = 0, sumY = 0, sumZ = 0;
while (n--) {
cin >> x >> y >> z;
sumX += x;
sumY += y;
sumZ += z;
}
if (sumX == 0 && sumY == 0 && sumZ == 0)
cout << "YES";
else
cout << "NO";
return 0;
}
Giải thích:
Khai báo 3 biến sumX, sumY, sumZ để lưu tổng lực theo từng trục
Duyệt n vector:
Cộng lần lượt từng thành phần vào sumX, sumY, sumZ
Cuối cùng: nếu tất cả tổng đều bằng 0 thì "YES", ngược lại "NO"
vd:
Input:
3
3 -1 7
-5 2 -4
2 -1 -3
Tính tổng từng trục:
X: 3 + (–5) + 2 = 0
Y: –1 + 2 + (–1) = 0
Z: 7 + (–4) + (–3) = 0
Output: YES (vì hệ lực cân bằng)
# Bài 28:Nearly Lucky Number
Tóm tắt:Cho một số nguyên n (rất lớn, tới 10¹⁸, nên ta phải đọc nó dưới dạng chuỗi).
Hãy kiểm tra xem số lượng chữ số 4 và 7 trong n có phải là 4 hoặc 7 không.
Nếu đúng thì in "YES"
Ngược lại thì in "NO"
link:https://codeforces.com/problemset/problem/110/A
code:
#include <iostream>
using namespace std;
int main() {
string n;
cin >> n;
int count = 0;
for (char c : n)
if (c == '4' || c == '7') count++;
if (count == 4 || count == 7)
cout << "YES";
else
cout << "NO";
return 0;
}
Giải thích:
Đọc số nguyên n dưới dạng chuỗi (string) để duyệt từng chữ số.
Duyệt từng ký tự trong chuỗi:
Nếu ký tự là '4' hoặc '7', tăng biến đếm
Sau vòng lặp, nếu tổng chữ số 4/7 là 4 hoặc 7 thì in "YES"
Ngược lại thì in "NO"
vd:
Input:
7747774
Có 7 chữ số là 4 hoặc 7
Output: YES
# Bài 29: Anton and Danik
Tóm tắt:
Anton và Danik chơi n ván cờ.
Kết quả mỗi ván được ghi bằng một ký tự:
'A' thì Anton thắng
'D' thì Danik thắng
Cho chuỗi kết quả của n ván, hãy in ra ai là người thắng nhiều hơn.
Nếu bằng nhau, in "Friendship".
link:https://codeforces.com/problemset/problem/734/A
code:
#include <iostream>
using namespace std;
int main(){
int n;
cin >> n;
string s;
cin >> s;
int a = 0, d = 0;
for(char c : s){
if(c == 'A') a++;
else if(c == 'D') d++;
}
if (a < d){
cout << "Danik";
}
else if(a > d){
cout << "Anton";
}
else{
cout << "Friendship";
}
return 0;
}
Giải thích:
Nhập số nguyên n và chuỗi kết quả gồm n ký tự.
Duyệt chuỗi và đếm số lần thắng của Anton (A) và Danik (D).
So sánh kết quả:
Nếu Anton thắng nhiều hơn thì in "Anton"
Nếu Danik thắng nhiều hơn thì in "Danik"
Nếu bằng nhau thì in "Friendship"
vd:
Input:
6
ADAAAA
Đếm:
Anton thắng: 5 lần (A)
Danik thắng: 1 lần (D)
Output:
Anton
# Bài 30:Vanya and Fence
Vanya và bạn của anh ấy đang đi bộ cạnh một hàng rào cao h.
Có n người bạn, mỗi người có chiều cao.
Vanya chụp ảnh mọi người trong một hàng ngang, nhưng:
Nếu chiều cao người đó ≤ h thì chiếm 1 đơn vị chiều ngang.
Nếu chiều cao > h thì người đó cúi người, chiếm 2 đơn vị chiều ngang.
Bạn phải tính tổng chiều ngang tối thiểu cần thiết để xếp hết n người.
link:https://codeforces.com/problemset/problem/677/A
code:
#include <iostream>
using namespace std;
int main() {
int n, h;
cin >> n >> h;
int width = 0;
for (int i = 0; i < n; ++i) {
int a;
cin >> a;
if (a > h)
width += 2;
else
width += 1;
}
cout << width << endl;
return 0;
}
Giải thích:
Nhập n, h và n số chiều cao
Duyệt từng chiều cao:
Nếu height ≤ h thì +1 vào tổng
Nếu height > h thì +2 vào tổng
In tổng
# Bài 31:Tram
Bạn được cho n trạm tàu điện.
Tại mỗi trạm, có:
aᵢ: số người xuống tàu
bᵢ: số người lên tàu
Ban đầu, tàu trống hoàn toàn (0 người).
Tính tối đa đã từng có bao nhiêu người trên tàu trong suốt hành trình.
link:https://codeforces.com/problemset/problem/116/A
code:
#include <iostream>
using namespace std;
int main() {
int n, cur = 0, res = 0, a, b;
cin >> n;
while (n--) {
cin >> a >> b;
cur += b - a;
res = max(res, cur);
}
cout << res;
}
Giải:
Duyệt từng trạm
Cập nhật số người hiện tại trên tàu: current += b - a
Tại mỗi bước, cập nhật maxPeople nếu current lớn hơn
Sau vòng lặp, in maxPeople
vd:
Input:
4
0 3
2 5
4 2
4 0
Giá trị lớn nhất từng đạt: 6 thì Output: 6
# Bài 32:In Search of an Easy Problem
Tóm tắt:
Có n sinh viên, mỗi người cho ý kiến về một bài tập:
Nếu thấy dễ, ghi 0
Nếu thấy khó, ghi 1
Yêu cầu:
Nếu có ít nhất 1 người đánh giá là khó (1) →thì in "HARD"
Ngược lại (tất cả là 0) thì in "EASY"
code:
#include <iostream>
using namespace std;
int main() {
int n, x;
cin >> n;
while (n--) {
cin >> x;
if (x == 1) {
cout << "HARD";
return 0;
}
}
cout << "EASY";
return 0;
}
Giải thích:
Duyệt n số ý kiến
Nếu gặp số 1 thì in "HARD" và kết thúc
Nếu duyệt hết chỉ thấy 0 thì in "EASY"
vd:
Input:
5
0 0 0 0 0
Không ai thấy khó
Output: EASY
Input:
4
0 1 0 0
Có người thấy khó
Output: HARD
# Bài 33:Chat room
Tóm tắt:
Cho một chuỗi s, bao gồm chữ cái thường (lowercase).
Cần kiểm tra xem có thể trích ra chuỗi "hello" từ s theo đúng thứ tự không.
Không cần liên tiếp, chỉ cần đúng thứ tự.
Nếu có thì in "YES"
Nếu không thì in "NO"
link:https://codeforces.com/problemset/problem/58/A
code:
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
cin >> s;
string target = "hello";
int j = 0; // chỉ số cho chuỗi "hello"
for (int i = 0; i < s.size(); i++) {
if (s[i] == target[j]) {
j++;
}
if (j == target.size()) break;
}
if (j == target.size())
cout << "YES";
else
cout << "NO";
return 0;
}
Giải thích:
Duyệt từng ký tự trong chuỗi, kiểm tra xem có khớp với từng ký tự trong "hello" không.
Dùng một biến đếm j để theo dõi vị trí cần khớp trong "hello".
vd:
Input:
hlelo
Output:
NO
# Bài 34:Queue at the School
Tóm tắt:Có một hàng gồm n học sinh đứng xếp hàng. Mỗi học sinh là bé trai (B) hoặc bé gái (G). Trong 1 giây, nếu có một cặp B đứng ngay trước G, thì họ sẽ đổi chỗ cho nhau. Tất cả các cặp như vậy sẽ đổi chỗ đồng thời trong 1 giây.
Cho hàng ban đầu và số giây t, in ra thứ tự của hàng sau t giây.
link:https://codeforces.com/problemset/problem/266/B
code:
#include <iostream>
#include <string>
using namespace std;
#include <iostream>
#include <string>
using namespace std;
int main() {
int n, t;
string s;
cin >> n >> t;
cin >> s;
while (t--) {
for (int i = 0; i < n - 1; i++) {
if (s[i] == 'B' && s[i + 1] == 'G') {
swap(s[i], s[i + 1]);
i++;
}
}
}
cout << s;
return 0;
}
Giải thích:
Thực hiện lặp lại t lần quá trình sau:
Bắt đầu từ đầu hàng, nhìn từng cặp học sinh liền kề từ trái sang phải.
Khi gặp một cặp gồm bé trai đứng trước bé gái, ghi nhận rằng sẽ đổi chỗ trong giây này.
Sau khi một cặp đổi chỗ, không xét lại phần tử vừa đổi chỗ trong giây đó nữa. Vì trong cùng một giây, mỗi học sinh chỉ được tham gia vào một lần đổi chỗ.
Sau t lần như vậy, thu được kết quả cuối cùng.
vd:
Input:
B G G B G
Sau 1 giây, các cặp "BG" đổi chỗ:
B G → G B (ở đầu)
B G → G B (ở cuối)
Output:
G B G G B
# Bài 35:Beautiful Year
Tóm tắt:Cho một năm y (số nguyên 4 chữ số), yêu cầu tìm năm gần nhất lớn hơn y sao cho tất cả các chữ số trong năm đó đều khác nhau.
link:https://codeforces.com/problemset/problem/271/A
code:
#include <iostream>
#include <string>
#include <set>
using namespace std;
bool allDigitsDifferent(int year) {
string s = to_string(year);
set<char> digits(s.begin(), s.end());
return digits.size() == 4;
}
int main() {
int y;
cin >> y;
y++;
while (!allDigitsDifferent(y)) {
y++;
}
cout << y << "\n";
return 0;
}
Giải thích:
Bắt đầu từ năm y + 1, ta kiểm tra từng năm liên tiếp.
Với mỗi năm:
Kiểm tra xem 4 chữ số của nó có tất cả khác nhau không.
Cách làm:
Chuyển năm thành chuỗi.
Dùng set hoặc mảng đếm để kiểm tra số lượng chữ số duy nhất.
Nếu số lượng ký tự duy nhất = 4 ⇒ Đây là năm đẹp (beautiful).
Khi tìm được năm đầu tiên thỏa mãn, in ra và kết thúc.
vd:
Input
1999
Output
2013
Bài