Trong bài toán này, chúng ta được cung cấp một mảng stu[] kích thước n biểu thị điểm của học sinh trong lớp. Điểm tối đa của mỗi học sinh là 100 và học sinh cần 50 điểm để đỗ. Nhiệm vụ là viết chương trình tìm Số học sinh tối đa đỗ sau khi cộng điểm thưởng cho tất cả và không vượt quá 100 điểm.
Mô tả bài toán
Chúng ta cần cộng điểm thưởng cho học sinh để đỗ nhưng điểm thưởng sẽ được cộng cho tất cả học sinh. Nhiệm vụ là tối đa hóa số học sinh đỗ bằng cách cộng điểm thưởng nhưng không học sinh nào được quá 100 điểm sau khi cộng thưởng. Sau đó trả về số học sinh đỗ tối đa.
Ví dụ minh họa
Đầu vào
stu[] = {45, 32, 78, 10, 53, 67}
Đầu ra
5
Giải thích
Tất cả học sinh đỗ:
45 + 22 = 67
32 + 22 = 54
78 + 22 = 100
53 + 22 = 75
67 + 22 = 89
Phương pháp giải
Để giải bài toán, ta cần cộng điểm cho học sinh nhưng điểm tối đa của bất kỳ học sinh nào không được vượt quá 100. Vì vậy điểm thưởng tối đa có thể cộng là:
Học sinh có điểm cao nhất (M) + thưởng = 100
Thưởng = 100 - M
Sau đó cộng thưởng này vào điểm hiện tại của học sinh. Nếu vượt quá 50, học sinh đỗ. Kết quả là đếm tất cả học sinh như vậy.
Thuật toán
Khởi tạo
passCount = 0;
Bước 1
Tìm học sinh có điểm cao nhất, maxMarks.
Bước 2
Tính điểm thưởng có thể cộng cho tất cả, bonus = 100 - maxMarks.
Bước 3
Vòng lặp i từ 0 đến n-1
Bước 3.1
Nếu (stu[i] + bonus >= 50), passCount++.
Bước 4
Trả về passCount.
Chương trình minh họa
#include <iostream>
using namespace std;
int calcPassCount(int stu[], int n) {
int maxMarks = stu[0];
for (int i = 1; i < n; i++) {
if (stu[i] > maxMarks)
maxMarks = stu[i];
}
int bonusMarks = 100 - maxMarks;
int passCount = 0;
for (int i = 0; i < n; i++) {
if (stu[i] + bonusMarks >= 50)
passCount++;
}
return passCount;
}
int main() {
int stu[] = {45, 32, 78, 10, 53, 67};
int n = sizeof(stu) / sizeof(stu[0]);
cout << "Số học sinh tối đa đỗ sau khi cộng điểm thưởng cho tất cả là "
<< calcPassCount(stu, n);
return 0;
}
Đầu ra
Số học sinh tối đa đỗ sau khi cộng điểm thưởng cho tất cả là 5