众安保险笔试 众安保险笔试题 0910

笔试时间:2025年9月10日

往年笔试合集:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题:学堂分组

题目:小葵花学堂共有n名学生报名入学测试,小A教授希望将所有学生重新排序,然后根据成绩分组,每组人数不超过3。

分组规则如下:

  • 如果组内有三名学生,则该组最高成绩和最低成绩之差不超过10
  • 如果组内有两名学生,则该组最高成绩和最低成绩之差不超过20
  • 如果组内仅有一名学生,则对成绩不作要求

要求:每位学生都需要,且恰好需要被分配到一个组中。在上述规则下,最少需要多少组?

输入描述

第一行输入一个整数n,表示学生人数;第二行输入n个整数,表示每位学生的入学测试成绩。

输出描述

输出一个整数,表示在上述分组规则下,最少需要的组数。

样例输入

3

100 100 100

样例输出

1

样例说明:在这个样例中,三名学生成绩均相同,可组成一个三人组,故最少需要1组。

参考题解

解题思路:

  1. 先把成绩排序
  2. 从左到右依次尝试把学生放进一个组: 先尽量凑三个人,如果能满足差值≤10,就成一个三人组如果不行,再试能不能组成两人组(差值≤20)否则只能单独成组
  3. 每次确定一组后,从数组中移到下一批人,直到所有人分完
  4. 这种贪心策略可以保证组数最少

C++:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    int n;
    cin >> n;
    vector<int> scores(n);
    for (int i = 0; i < n; i++) {
        cin >> scores[i];
    }
    
    sort(scores.begin(), scores.end());
    
    int groups = 0;
    int i = 0;
    while (i < n) {
        groups++;
        // 先尝试三人组
        if (i + 2 < n && scores[i + 2] - scores[i] <= 10) {
            i += 3;
        } else if (i + 1 < n && scores[i + 1] - scores[i] <= 20) {
            // 否则尝试两人组
            i += 2;
        } else {
            // 否则单人组
            i += 1;
        }
    }
    
    cout << groups << endl;
    return 0;
}

Java:

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] scores = new int[n];
        for (int i = 0; i < n; i++) {
            scores[i] = sc.nextInt();
        }
        
        Arrays.sort(scores);
        
        int groups = 0;
        int i = 0;
        while (i < n) {
            groups++;
            // 先尝试三人组
            if (i + 2 < n && scores[i + 2] - scores[i] <= 10) {
                i += 3;
            } else if (i + 1 < n && scores[i + 1] - scores[i] <= 20) {
                // 否则尝试两人组
                i += 2;
            } else {
                // 否则单人组
                i += 1;
            }
        }
        
        System.out.println(groups);
    }
}

Python:

n = int(input())
scores = list(map(int, input().split()))

scores.sort()

groups = 0
i = 0
while i < n:
    groups += 1
    # 先尝试三人组
    if i + 2 < n and scores[i + 2] - scores[i] <= 10:
        i += 3
    elif i + 1 < n and scores[i + 1] - scores[i] <= 20:
        # 否则尝试两人组
        i += 2
    else:
        # 否则单人组
        i += 1

print(groups)

第二题:小红的生日查询

题目:小红的出生日期是y年m月d日。小红想知道,从a年b月c日到a'年b'月c'日,她一共过了多少天的生日?

假设出生的那一天也算小红0岁生日。且小红在a'年b'月c'日并未死亡。如果小红是闰年2月29日出生,那么她在非闰年2月28日和闰年2月29日过生日。

输入描述

有多组数据,第一行输入一个整数T,代表数据组数。对于每组数据,第一行输入三个正整数y,m,d,表示小红的出生年月日。第二行输入六个正整数a,b,c,a',b',c',代表小红的询问。保证年份范围在[1,3000]之间,且查询的时间合法。查询的截止日在起始日的后面。

输出描述

输出一个整数,代表小红的过生日的次数。

样例输入

1

1993 9 21

1990 1 1 2000 12 31

样例输出

8

参考题解

解题思路:

  1. 输入处理:读取小红的出生日期和查询的起始、截止日期
  2. 遍历年份:从小红的出生年份到查询截止年份
  3. 构造每年的生日: 特殊情况:如果是2月29日出生 闰年:生日是2月29日平年:生日是2月28日普通生日:直接使用出生月日构造生日
  4. 判断生日是否落在查询区间内并计数
  5. 使用闰年判断规则:能被4整除且不能被100整除,或者能被400整除

C++:

#include <iostream>
using namespace std;

bool isLeapYear(int year) {
    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2025 春招笔试合集 文章被收录于专栏

2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南

全部评论

相关推荐

评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务