题目链接
题目描述
问题描述
在小C的班级里,有 N 个学生,每个学生的成绩是 A_i。小C发现了一件有趣的事:当且仅当某个学生的成绩小于或等于自己的有更多人时,这个学生会说谎。换句话说,如果分数小于等于他的学生数量大于比他分数高的学生数量,则他会说谎。
现在,小C想知道班里有多少个学生会说谎。
测试样例
样例1:
输入:
A = [100, 100, 100]输出:3
样例2:
输入:
A = [2, 1, 3]输出:2
样例3:
输入:
A = [30, 1, 30, 30]输出:3
样例4:
输入:
A = [19, 27, 73, 55, 88]输出:3
样例5:
输入:
A = [19, 27, 73, 55, 88, 88, 2, 17, 22]输出:5
题目思路
模拟题,难点在于读懂题目。
没错,题目太抽象了,简而言之,就是分数比自己高的人如果比分数小于等于自己人的少的话,这个人就会撒谎、
为什么分数高了要撒谎?
大概就是这个意思,读懂题目的意思了,我们就按照普通模拟题的思路解决这个问题:
遍历所有的人,然后再遍历所有人,找出比每个人高的分数和低的分数的人数,然后判断,时间复杂度大概是O(n^2)
题解代码
// 省事直接用万能头文件
#include <bits/stdc++.h>
// 为了方便,使用了C++11的标准
using namespace std;
int solution(std::vector<int> A) {
// 创建答案变量
int ans = 0;
// 遍历数组,对每一个元素进行判断
for(auto i : A){
// 计算大于i的元素个数和小于等于i的元素个数
int mx = 0,mn = 0;
// 遍历数组,统计大于i的元素个数和小于等于i的元素个数
for(auto j : A){
// 如果j大于i,mx加1,如果j小于等于i,mn加1
if(j > i) mx++;
if(j <= i) mn++;
}
// 为什么要mn--呢,因为遍历的过程中也有统计了i,所以要减去
mn--;
// 如果mx小于等于mn,ans加1
if(mx <= mn) ans++;
}
// 返回答案
return ans;
}
int main() {
// Add your test cases here
std::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;
}
反思
很简单的模拟题,理清思路就好做,加油加油