统计班级中的说谎者 | 豆包MarsCode AI刷题

54 阅读2分钟

题目链接

统计班级中的说谎者 - MarsCode

题目描述

问题描述

在小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;
}

反思

很简单的模拟题,理清思路就好做,加油加油