题目
班里有 N 个学生,第 i 个学生的分数是 A_i
。当且仅当分数 <= A_i
的学生数量多于分数比他高的数量时,第 i 个学生会说谎。求出有多少学生会说谎。
输入格式
-
输入
N
学生的成绩,包含A_1, A_2, ..., A_N
输出格式
对于每组数据,输出有多少学生会说谎。
数据范围
-
1≤N≤1001≤N≤100
-
0≤Ai≤1000≤Ai≤100
输入
100 100 100
输出
3
输入
2 1 3
输出
2
demo
#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>int solution(std::vector<int> A) {int N = A.size();std::unordered_map<int, int> score_count;// 统计每个分数的出现次数for (int score : A) {score_count[score]++;}// 计算说谎的学生数量int liars = 0;int cumulative_count = 0; // 记录分数小于当前分数的学生数量// 获取所有分数并排序std::vector<int> unique_scores;for (const auto& pair : score_count) {unique_scores.push_back(pair.first);}std::sort(unique_scores.begin(), unique_scores.end());// 遍历每个分数for (int score : unique_scores) {// 当前分数的学生数量int current_count = score_count[score];// 分数小于等于当前分数的学生数量int less_equal_count = cumulative_count + current_count;// 分数高于当前分数的学生数量int greater_count = N - less_equal_count;// 判断是否说谎if (less_equal_count > greater_count) {liars += current_count; // 所有分数为 score 的学生都说谎}// 更新累计计数cumulative_count += current_count;}return liars;
}int main() {// Add your test cases herestd::cout << (solution({100, 100, 100}) == 3) << std::endl;std::cout << (solution({2, 1, 3}) == 2) << std::endl;std::cout << (solution({30, 1, 30, 30}) == 3) << std::endl;std::cout << (solution({19, 27, 73, 55, 88}) == 3) << std::endl;std::cout << (solution({19, 27, 73, 55, 88, 88, 2, 17, 22}) == 5) << std::endl;return 0;
}
- 使用
cumulative_count
来记录分数小于当前分数的学生数量。 - 在遍历
unique_scores
时,计算每个分数的less_equal_count
和greater_count