Bỏ qua
Tuần 1

Mảng 1 chiều

Độ khó
★☆☆☆☆ Dễ
Thời lượng
Khoảng 90 phút
Học trước
Không cần, có thể học ngay
Chủ đề
mảngvòng lặp
Trạng thái

Kiến thức cơ bản

Mảng 1 chiều (1D Array) là một dãy các phần tử có cùng kiểu dữ liệu, được lưu trữ liên tiếp nhau trong bộ nhớ và truy xuất thông qua chỉ số (index).

Kiểu dữ liệu: cùng là số nguyên, số thực, hoặc ký tự,...

Chỉ số: bắt đầu từ 0 đến n - 1 (với n là số lượng phần tử của mảng).

Khai báo mảng 1 chiều

int a[100]; // Khai báo mảng chứa các số int tối đa 100 phần tử
int b[6] = {2, 8, 0, 4, 2, 5}; // khai báo mảng b, gán giá trị 2 8 0 4 2 5
double c[200]; // Khai báo mảng chứa các số double tối đa 200 phần tử
char d[20000]; // Khai báo mảng chứa các ký tự tối đa 20000 phần tử
char f[100] = {'a', 'b', 'c'}; // khai báo mảng a và gán 3 phần tử đầu tiên

Duyệt mảng: sử dụng vòng lặp

// Duyệt xuôi: nhập vào từ bàn phím
for(int i = 0; i < n; ++i) cin >>a[i];
// Duyệt ngược: in ra mảng a theo thứ tự ngược lại
for(int i = n-1; i >= 0; --i) cout << a[i] << " ";

Luyện tập

Bài 1. Tính điểm

Thầy vừa chấm bài kiểm tra môn Tin học cho cả lớp. Bạn hãy giúp thầy viết một chương trình tính tổng điểm và điểm trung bình cộng của cả lớp nhé!

Đầu vàoDòng 1: Số nguyên n (số lượng học sinh). Dòng 2: n số nguyên cách nhau bởi khoảng trắng là điểm số của từng bạn
Đầu raDòng 1: Tổng điểm cả lớp.
Dòng 2: Điểm trung bình cộng (lấy chính xác 2 chữ số thập phân).
Dòng 3: Số bạn đạt điểm 10 của lớp.
TestInputOutput
5
8 9 7 10 6
40
8.00
1

Bài 2. Bạn nào cao nhất lớp?

Trong buổi đo chiều cao đầu năm học, cô giáo muốn tìm ra bạn học sinh cao nhất lớp. Nếu có nhiều bạn cùng có chiều cao lớn nhất bằng nhau, cô sẽ chọn bạn xuất hiện đầu tiên trong danh sách. Bạn hãy giúp cô tìm chiều cao lớn nhất đó và chỉ số (tính từ 0) của bạn ấy nhé!

Đầu vàoDòng 1: Số nguyên n (số lượng học sinh).
Dòng 2: n số nguyên biểu diễn chiều cao (cm) của các bạn
Đầu raChiều cao lớn nhất và chỉ số (tính từ 0) của bạn ấy, cách nhau khoảng trắng.
TestInputOutput
6
140 155 160 145 160 150
160 2

Bài 3. Truy tìm mật mã X

Nhiệm vụ của bạn là truy tìm xem số mật mã X có xuất hiện trong dãy hay không. Nếu tìm thấy, hãy chỉ ra chỉ số (tính từ 0) xuất hiện đầu tiên của nó. Nếu không tìm thấy, hãy ghi lại số -1.

Đầu vàoDòng 1: Hai số nguyên n (số phần tử) và X (mật mã cần tìm).
Dòng 2: n số nguyên của dãy.
Đầu raIn ra chỉ số (tính từ 0) đầu tiên tìm thấy số X. Nếu không có X trong mảng thì in -1.
TestInputOutput
6 7
2 4 7 1 7 8
2

Bài 4. Kiểm tra mảng đối xứng

Một dãy số được gọi là đối xứng nếu bạn đọc từ trái sang phải hay từ phải sang trái thì các số vẫn hoàn toàn giống hệt nhau (ví dụ: 1, 3, 5, 3, 1). Hãy viết chương trình in ra “YES” nếu dãy đã cho là đối xứng, ngược lại in ra “NO”.

Đầu vàoDòng 1: Số nguyên n là số lượng phần tử.
Dòng 2: n số nguyên của dãy.
Đầu raIn ra YES nếu mảng đối xứng, ngược lại in ra NO.
TestInputOutput
5
1 3 5 3 1
YES

Bài 5. Bắt tay đổi chỗ

Trong một trò chơi dân gian, các bạn học sinh đứng thành một hàng dọc. Giờ chơi yêu cầu bạn đứng đầu hàng đổi vị trí cho bạn cuối hàng, bạn thứ hai đổi chỗ cho bạn kế cuối,... cứ như vậy cho đến khi cả hàng bị đảo ngược hoàn toàn. Hãy viết chương trình thực hiện việc đổi chỗ trực tiếp trên mảng này nhé!

Đầu vàoDòng 1: Số nguyên n là số lượng phần tử.
Dòng 2: n số nguyên của dãy.
Đầu raIn ra dãy số sau khi đã đảo ngược tại chỗ, các số cách nhau bởi một khoảng trắng.
TestInputOutput
6
2 4 6 8 10 12
12 10 8 6 4 2

Bài 6. Chia tổ Chẵn - Lẻ

Thầy giáo thể dục muốn chia lớp thành 2 tổ để thi đấu: Tổ Chẵn (gồm các bạn mang số áo chẵn) và Tổ Lẻ (gồm các bạn mang số áo lẻ). Bạn hãy giúp thầy tách danh sách lớp thành 2 nhóm, in nhóm các bạn số áo chẵn trước, sau đó in nhóm các bạn số áo lẻ nhé (giữ nguyên thứ tự đứng ban đầu).

Đầu vàoDòng 1: Số nguyên n là số lượng học sinh
Dòng 2: n số nguyên biểu diễn số áo của các bạn
Đầu raDòng 1: In các số chẵn cách nhau bởi khoảng trắng.
Dòng 2: In các số lẻ cách nhau bởi khoảng trắng.
TestInputOutput
6
1 4 7 8 2 5
4 8 2
1 7 5

Bài 7. Rời khỏi hàng mua kem (xóa phần tử)

Một hàng gồm n bạn nhỏ đang xếp hàng chờ mua kem. Tự nhiên bạn ở vị trí thứ k (tính từ 0) có việc bận nên phải rời khỏi hàng. Các bạn đứng phía sau bạn k sẽ bước lên một bước để lấp vào chỗ trống. Bạn hãy in lại thứ tự các bạn trong hàng sau khi bạn thứ k rời đi nhé!

Đầu vàoDòng 1: Hai số nguyên n (số bạn) và k (vị trí bạn rời hàng, 0 ≤ k < n). Dòng 2: n số nguyên biểu diễn hàng ban đầu.
Đầu ran - 1 phần tử còn lại sau khi xóa, cách nhau bởi khoảng trắng
TestInputOutput
6 2
1 4 7 8 2 5
1 4 8 2 5

Bài 8. Chen vào hàng mua vé (chèn phần tử)

Các bạn đang xếp hàng mua vé xem phim. Lúc này, bạn X đến muộn nhưng được ưu tiên chen vào vị trí thứ k trong hàng. Các bạn đứng từ vị trí k trở về sau sẽ phải lùi lại để nhường chỗ cho bạn X. Hãy in ra danh sách hàng mới sau khi chèn bạn X vào nhé!

Đầu vàoDòng 1: Ba số nguyên n (số lượng ban đầu), k (vị trí chèn, 0 ≤ k < n) và X (giá trị chèn).
Dòng 2: n số nguyên của mảng ban đầu
Đầu raIn ra n + 1 phần tử của mảng sau khi chèn, cách nhau bởi dấu cách
TestInputOutput
5 2 99
1 2 3 4 5
1 2 99 3 4 5

Bài 9. Ai là Á quân? (phần tử lớn thứ nhì)

Trong một cuộc thi, bạn có điểm số cao nhất là Quán quân. Bạn đạt điểm cao tiếp theo (nhưng phải nhỏ hơn điểm của Quán quân) sẽ là Á quân. Hãy tìm điểm số của Á quân trong danh sách điểm thi. Nếu không có Á quân (tất cả mọi người bằng điểm nhau), hãy in ra -1.

Đầu vàoDòng 1: Số nguyên n (số lượng thí sinh).
Dòng 2: n số nguyên là điểm số của các thí sinh.
Đầu raIn ra giá trị lớn thứ nhì (Á quân). Nếu không tồn tại thì in -1.
TestInputOutput
6
5 9 3 9 7 2
7

Bài 10. Thống kê số lần điểm danh (phần tử xuất hiện nhiều nhất)

Bác bảo vệ muốn thống kê xem số hiệu học sinh nào xuất hiện nhiều lần nhất trong danh sách điểm danh ra vào cổng trường. Hãy tìm số hiệu xuất hiện nhiều nhất và đếm xem số đó xuất hiện bao nhiêu lần. Nếu có nhiều số có cùng số lần xuất hiện nhiều nhất, hãy chọn số có giá trị nhỏ nhất nhé!

Đầu vàoDòng 1: Số nguyên n (số lượt điểm danh).
Dòng 2: mảng a gồm n số nguyên dương biểu diễn các số hiệu.
Giới hạn1 ≤ n, a[i] ≤ 105
Đầu raIn ra hai số nguyên cách nhau một khoảng trắng: giá trị xuất hiện nhiều nhất và số lần xuất hiện của nó.
TestInputOutput
7
3 5 3 2 5 3 7
3 3

Bài tập tự luyện

Bài 1. Các bài toán cơ bản

Cho mảng số nguyên gồm N phần tử. Thực hiện in ra các yêu cầu sau đây.

Đầu vàoDòng đầu tiên là số lượng phần tử trong mảng.
Dòng thứ 2 là N phần tử trong mảng.
Giới hạn2 ≤ n ≤ 106; -109 ≤ a[i] ≤ 109
Đầu raDòng đầu tiên ghi số lớn nhất trong mảng kèm theo vị trí của nó (bắt đầu từ 0), nếu có nhiều số cùng có giá trị lớn nhất thì lấy vị trí xuất hiện đầu tiên.
Dòng thứ 2 ghi số nhỏ nhất trong mảng kèm theo vị trí của nó (bắt đầu từ 0), nếu có nhiều số cùng có giá trị nhỏ nhất thì lấy vị trí xuất hiện cuối cùng.
Dòng thứ 3 ghi ra số lượng số nguyên tố xuất hiện trong dãy.
Dòng thứ 4 ghi ra tích lớn nhất của 2 số trong mảng (2 số khi nhân với nhau tạo ra tích lớn nhất).
Dòng thứ 5 in ra YES nếu mảng đối xứng, ngược lại in ra NO.
TestInputOutput
6
-10 -10 2 3 4 5
5 5
-10 1
3
100
NO

Bài 2. Cặp đôi Domino (phần tử liền kề giống nhau)

Gấu Bo đang chơi xếp một hàng gồm n quân cờ Domino. Bo rất thích thú khi thấy hai quân cờ đứng sát cạnh nhau mà lại mang cùng một con số may mắn. Bạn hãy giúp Bo đếm xem trong cả hàng có bao nhiêu cặp quân cờ liền kề có giá trị giống hệt nhau nhé.

Đầu vàoDòng 1: Số nguyên n (2 ≤ n ≤ 106) – số lượng quân cờ Domino.
Dòng 2: n số nguyên biểu diễn các số ghi trên quân cờ.
Đầu raIn ra một số nguyên duy nhất là số cặp phần tử liền kề bằng nhau (a[i] == a[i+1])
TestInputOutput
7
1 2 2 3 5 5 5
3
Giải thích: có 3 cặp đứng cạnh nhau bằng nhau (1, 2), (4, 5), (5, 6).

Bài 3. Kiểm tra mảng tăng dần

Kiểm tra xem mảng đã cho có tăng chặt hay không, tức là các phần tử đứng sau luôn lớn hơn phần tử đứng trước nó.

  • Gợi ý: Xét N - 1 cặp số đứng cạnh nhau, nếu cả N - 1 cặp đều thỏa mãn số đứng sau lớn hơn số đứng trước thì mảng tăng dần. Lưu ý không xét a[0] với số đứng trước nó, việc này sẽ so sánh a[0] với a[-1].
Đầu vàoDòng đầu tiên là số lượng phần tử trong mảng.
Dòng thứ 2 là N phần tử trong mảng.
Giới hạn1 ≤ n ≤ 106; 1 ≤ a[i] ≤ 109
Đầu raIn YES nếu các phần tử trong mảng tăng dần, ngược lại in NO.
TestInputOutput
6
1 2 3 8 9 22
YES

Bài 4. Số lớn hơn các số đứng trước

Cho một dãy số nguyên dường có N phần tử. Hãy liệt kê số các phần tử trong dãy lớn hơn tất cả các số đứng trước nó (Phần tử đầu tiên được coi là một phần tử thỏa mãn).

Đầu vàoDòng đầu tiên là số lượng phần tử trong mảng.
Dòng thứ 2 là N phần tử trong mảng.
Giới hạn2 ≤ n ≤ 106; -109 ≤ a[i] ≤ 109
Đầu raLiệt kê các số thỏa mãn
TestInputOutput
6
2 6 1 3 9 9
2 6 9

Bài 5. Bước nhảy của Chú ếch

Chú ếch Kero đang nhảy qua các phiến đá trên bờ suối. Phiến đá thứ i có tọa độ là a[i]. Mỗi lần nhảy từ phiến đá i sang phiến đá i+1 thì độ dài bước nhảy của Kero chính là chênh lệch giữa hai phiến đá, tính bằng |a[i+1] – a[i]|. Hãy giúp Kero tìm xem bước nhảy dài nhất mà chú đã thực hiện có độ dài bằng bao nhiêu!

Đầu vàoDòng 1: Số nguyên n (2 ≤ n ≤ 106) – số lượng phiến đá.
Dòng 2: n số nguyên là tọa độ của từng phiến đá (tọa độ có thể âm hoặc dương, |a[i]| ≤ 109)
Đầu raIn ra một số nguyên là độ dài bước nhảy lớn nhất
TestInputOutput
5
2 9 3 3 15
12
Giải thích: nhảy từ 3 lên 15, |15-3| = 12.

Bài 6. Gửi thư

Tất cả các thành phố của Lineland đều nằm trên trục tọa độ Ox. Do đó, mỗi thành phố được liên kết với vị trí xi - tọa độ trên trục Ox. Không có hai thành phố được đặt tại một điểm. Cư dân Lineland thích gửi thư cho nhau. Một người chỉ có thể gửi thư nếu người nhận sống ở một thành phố khác. Chi phí gửi thư chính xác bằng khoảng cách giữa thành phố của người gửi và thành phố của người nhận. Đối với mỗi thành phố, hãy tính hai giá trị mini và maxi, trong đó mini là chi phí tối thiểu để gửi thư từ thành phố thứ i đến một thành phố khác và maxi là chi phí tối đa để gửi thư từ thành phố thứ i đến một số thành phố khác.

  • Gợi ý: mini = khoảng cách nhỏ nhất giữa 2 thành phố đứng trước và đứng sau của thành phố hiện tại, maxi = khoảng cách lớn hơn tính từ thành phố hiện tại tới thành phố đầu tiên và từ thành phố hiện tại tới thành phố cuối cùng. Vì mảng đã sắp tăng dần nên mới có điều này.
Đầu vàoDòng đầu tiên là số nguyên dương n Dòng thứ hai chứa chuỗi n số nguyên khác nhau x1, x2, ..., xn (-109 ≤ xi ≤ 109), trong đó xi là tọa độ x của thành phố thứ i.
Tất cả các xi là khác biệt và theo thứ tự tăng dần.
Giới hạn2 ≤ n ≤ 106; -109 ≤ xi ≤ 109
Đầu raĐối với mỗi thành phố in ra 2 giá trị mini và maxi trên 1 dòng.
TestInputOutput
4
-5 -2 2 7
3 12
3 9
4 7
5 12

Bài 7. Đếm cặp số nguyên tố cùng nhau

Cho một dãy số nguyên dương có n phần tử. Hãy đếm các cặp số nguyên tố cùng nhau trong mảng.

Đầu vàoDòng đầu tiên là số lượng phần tử trong mảng n.
Dòng thứ 2 là các phần tử a[i] trong mảng
Giới hạn1 ≤ n ≤ 1000; 1 ≤ ai ≤ 109
Đầu raIn ra số lượng cặp số nguyên tố cùng nhau trong mảng.
TestInputOutput
5
2 4 8 3 6
3

Bài 8. Đếm tần suất

Cho mảng các số nguyên không âm gồm N phần tử, thực hiện đếm tần suất xuất hiện của các phần tử và in ra tần suất xuất hiện của các phần tử theo thứ tự từ nhỏ tới lớn sau đó bỏ trống 1 dòng và in ra tần suất xuất hiện của các phần tử theo thứ tự xuất hiện trong mảng (mỗi giá trị chỉ liệt kê 1 lần).

Đầu vàoDòng đầu tiên là số lượng phần tử trong mảng.
Dòng thứ 2 là N phần tử trong mảng.
Giới hạn2≤ n ≤ 106; 0 ≤ ai ≤ 107
Đầu raKết quả bài toán.
TestInputOutput
8
2 1 2 3 4 8 2 3
1 1
2 3
3 2
4 1
8 1
2 3
1 1
3 2
4 1
8 1

Bài 9. Bộ sưu tập thẻ bài (Đếm số phần tử phân biệt)

Hùng rất mê sưu tầm thẻ bài Pokemon. Mỗi thẻ bài có một mã số định danh là một số nguyên dương từ 1 đến 105. Sau một tháng sưu tầm, Hùng có một cọc gồm n thẻ bài, nhưng trong đó có nhiều thẻ bị trùng nhau. Hãy giúp Hùng đếm xem bạn ấy thực sự sở hữu bao nhiêu thẻ bài khác nhau!

Đầu vàoDòng 1: Số nguyên n (1 ≤ n ≤ 106) – tổng số thẻ bài Hùng đang có.
Dòng 2: n số nguyên biểu diễn mã số của các thẻ bài (1 ≤ a[i] ≤ 105)
Đầu raIn ra một số nguyên là số lượng thẻ bài khác nhau.
TestInputOutput
7
10 5 10 2 5 10 9
4
Giải thích: Có 4 loại thẻ khác nhau là: 10, 5, 2 và 9.

Bài 10. Đợt nắng nóng kỷ lục (đoạn con tăng liên tiếp dài nhất)

Đài khí tượng thủy văn theo dõi nhiệt độ của một thành phố trong n ngày liên tiếp. Một "đợt nắng nóng tăng nhiệt" là một chuỗi các ngày liên tục nhau mà nhiệt độ ngày hôm sau luôn cao hơn nhiệt độ ngày hôm trước a[i+1] > a[i]. Hãy tìm xem đợt tăng nhiệt liên tiếp dài nhất kéo dài trong bao nhiêu ngày?

Đầu vàoDòng 1: Số nguyên n (1 ≤ n ≤ 106) – số ngày theo dõi.
Dòng 2: n số nguyên là nhiệt độ các ngày (20 ≤ a[i] ≤ 45)
Đầu raIn ra một số nguyên duy nhất là số ngày của đợt tăng nhiệt liên tục dài nhất. (Lưu ý: một ngày đứng một mình cũng được coi là một đợt có độ dài bằng 1).
TestInputOutput
7
30 32 35 28 29 31 33
4
Giải thích: Có 2 đợt tăng nhiệt liên tiếp, Đợt 1: [30, 32, 35] dài 3 ngày, Đợt 2: [28, 29, 31, 33] dài 4 ngày. Kỷ lục dài nhất là 4 ngày.

Bài liên quan