Kỳ thi học sinh giỏi khối 9 môn Tin học năm nay có n học sinh tham
gia với tổng điểm của các học sinh lần lượt là các số tự nhiên a1, a2, a3, …
an. BTC quyết định chọn các học sinh để trao giải theo nguyên tắc sau: Đầu
tiên chọn [n/2] (phần nguyên của n/2) số học sinh có điểm từ cao xuống thấp,
sau đó chọn thêm những học sinh bằng điểm với học sinh có điểm thấp nhất
trong số này. Em hãy giúp BTC tính số lượng học sinh có giải.
Dữ liệu vào: Từ tệp văn bản tg.inp gồm:
Dòng đầu chứa số nguyên dương n (2 ≤ n ≤ 105
)
Dòng thứ hai chứa n số tự nhiên a1, a2, a3, … an. Hai số liên tiếp trên
một dòng được ghi cách nhau một dấu cách (0 ≤ ai ≤ 106
)
Dữ liệu ra: Ghi ra tệp tg.out
Một số nguyên duy nhất là số học sinh có giải.
Ví dụ:
tg.inp tg.out
5
98 97 100 98 98
4
Quảng cáo
2 câu trả lời 231
Giải pháp:
Để giải bài toán này, ta có thể sử dụng thuật toán sau:
Bước 1: Sắp xếp các số a1, a2, a3, ..., an theo thứ tự tăng dần.
Bước 2: Tìm điểm thấp nhất trong số [n/2] số có điểm cao nhất.
Bước 3: Cộng thêm số lượng học sinh có điểm bằng điểm thấp nhất tìm được ở bước 2.
Code C++:
C++
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
int a[n];
for (int i = 0; i < n; i++) {
cin >> a[i];
}
sort(a, a + n);
int min_score = a[n / 2 - 1];
int count = n / 2;
for (int i = n / 2; i < n; i++) {
if (a[i] == min_score) {
count++;
}
}
cout << count << endl;
return 0;
}
Vui lòng thận trọng khi sử dụng mã. Tìm hiểu thêm
content_copy
Giải thích:
Bước 1: Sắp xếp các số a1, a2, a3, ..., an theo thứ tự tăng dần để dễ dàng tìm ra điểm thấp nhất trong số [n/2] số có điểm cao nhất.
Bước 2: Tìm điểm thấp nhất trong số [n/2] số có điểm cao nhất.
Bước 3: Cộng thêm số lượng học sinh có điểm bằng điểm thấp nhất tìm được ở bước 2.
Ví dụ:
Với dữ liệu đầu vào
5
98 97 100 98 98
Thì kết quả đầu ra là
4
Vì [5/2] = 2, nên BTC sẽ chọn 2 học sinh có điểm cao nhất là 100 và 98. Sau đó, BTC sẽ chọn thêm 1 học sinh có điểm bằng 98, là học sinh thứ 3. Do đó, số lượng học sinh có giải là 4.
//Đọc dữ liệu từ tệp tg.inp
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
int main()
{
ifstream fin("tg.inp"); //Mở tệp tg.inp để đọc
int n; //Số học sinh tham gia kỳ thi
fin >> n; //Đọc số học sinh từ tệp
int a[n]; //Mảng lưu điểm của các học sinh
for (int i = 0; i < n; i++)
{
fin >> a[i]; //Đọc điểm của học sinh thứ i từ tệp
}
fin.close(); //Đóng tệp tg.inp
//Sắp xếp mảng a theo thứ tự giảm dần
sort(a, a + n, greater<int>());
//Tìm số học sinh có giải
int k = n / 2; //Số học sinh có điểm cao nhất được chọn
int min = a[k - 1]; //Điểm thấp nhất trong số học sinh được chọn
int count = k; //Số học sinh có giải
for (int i = k; i < n; i++)
{
if (a[i] == min) //Nếu học sinh thứ i có điểm bằng điểm thấp nhất
{
count++; //Tăng số học sinh có giải lên 1
}
else //Nếu học sinh thứ i có điểm nhỏ hơn điểm thấp nhất
{
break; //Dừng vòng lặp
}
}
//Ghi kết quả ra tệp tg.out
ofstream fout("tg.out"); //Mở tệp tg.out để ghi
fout << count; //Ghi số học sinh có giải vào tệp
fout.close(); //Đóng tệp tg.out
return 0;
}
Quảng cáo
Bạn cần hỏi gì?
Câu hỏi hot cùng chủ đề
-
Đã trả lời bởi chuyên gia
38770 -
Hỏi từ APP VIETJACK28076
