众安保险笔试 众安保险笔试题 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打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南