众安保险笔试 众安保险笔试题 0910
笔试时间:2025年9月10日
往年笔试合集:
第一题:学堂分组
题目:小葵花学堂共有n名学生报名入学测试,小A教授希望将所有学生重新排序,然后根据成绩分组,每组人数不超过3。
分组规则如下:
- 如果组内有三名学生,则该组最高成绩和最低成绩之差不超过10
- 如果组内有两名学生,则该组最高成绩和最低成绩之差不超过20
- 如果组内仅有一名学生,则对成绩不作要求
要求:每位学生都需要,且恰好需要被分配到一个组中。在上述规则下,最少需要多少组?
输入描述
第一行输入一个整数n,表示学生人数;第二行输入n个整数,表示每位学生的入学测试成绩。
输出描述
输出一个整数,表示在上述分组规则下,最少需要的组数。
样例输入
3
100 100 100
样例输出
1
样例说明:在这个样例中,三名学生成绩均相同,可组成一个三人组,故最少需要1组。
参考题解
解题思路:
- 先把成绩排序
- 从左到右依次尝试把学生放进一个组: 先尽量凑三个人,如果能满足差值≤10,就成一个三人组如果不行,再试能不能组成两人组(差值≤20)否则只能单独成组
- 每次确定一组后,从数组中移到下一批人,直到所有人分完
- 这种贪心策略可以保证组数最少
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
参考题解
解题思路:
- 输入处理:读取小红的出生日期和查询的起始、截止日期
- 遍历年份:从小红的出生年份到查询截止年份
- 构造每年的生日: 特殊情况:如果是2月29日出生 闰年:生日是2月29日平年:生日是2月28日普通生日:直接使用出生月日构造生日
- 判断生日是否落在查询区间内并计数
- 使用闰年判断规则:能被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等多种语言做法集合指南
