Description
按照xx大学的防疫规定,学生回校需要进行核酸检测,需要在回校的第1,3,7,11天进行核酸检测,
这时有n个同学(1<=n<=1e5)回校,他们每一个人会在a[i]天回校(1<=a[i]<=1e9),
这时学校想统计大于等于k(1<=k<=1e5)人做核酸的天数有多少天。
麻烦你帮学校统计一下!
输入格式
输入n,k
接下来一行输入n的数字,代表a[i]的数值
输出格式
输出一个数字,代表大于等于k人做核酸的天数有多少天。
输入样例
5 5 1 1 1 1 1
输出样例
4
主要步骤
-
输入数据:
读取学生人数n
和核酸检测人数阈值k
。读取每个学生的回校日期,并存储在returnDates
数组中。 -
确定核酸检测日期:
遍历每个学生的回校日期。对于每个回校日期,根据规定,分别计算并记录该学生在回校后的第 1、3、7、11 天的日期(即核酸检测日期)。将所有核酸检测日期存储在nucleicAcidDates
数组中。这里通过isValidDate
函数确保日期是有效的(大于 0)。 -
对核酸检测日期排序:
使用sort
函数对nucleicAcidDates
数组进行排序。排序的目的是将相同日期的核酸检测集中在一起,方便后续统计每个日期的检测人数。 -
统计满足条件的天数:
初始化一个变量totalDays
用于记录核酸检测人数大于等于k
的天数。遍历排序后的nucleicAcidDates
数组。对于每个日期,统计该日期的核酸检测人数(通过连续相同日期的个数来确定)。如果该日期的检测人数大于等于k
,则将totalDays
加 1。
完整代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 检查日期是否在给定范围内
bool isValidDate(int date) {
return date > 0;
}
int main() {
int n, k;
cin >> n >> k;
vector<int> returnDates(n);
for (int i = 0; i < n; ++i) {
cin >> returnDates[i];
}
vector<int> nucleicAcidDates;
// 遍历每个学生的回校日期,找出所有需要做核酸的日期
for (int date : returnDates) {
if (isValidDate(date)) nucleicAcidDates.push_back(date);
if (isValidDate(date + 2)) nucleicAcidDates.push_back(date + 2);
if (isValidDate(date + 6)) nucleicAcidDates.push_back(date + 6);
if (isValidDate(date + 10)) nucleicAcidDates.push_back(date + 10);
}
// 对所有需要做核酸的日期进行排序
sort(nucleicAcidDates.begin(), nucleicAcidDates.end());
int totalDays = 0;
int i = 0;
while (i < nucleicAcidDates.size()) {
int currentDate = nucleicAcidDates[i];
int count = 0;
// 统计当前日期做核酸的人数
while (i < nucleicAcidDates.size() && nucleicAcidDates[i] == currentDate) {
++count;
++i;
}
// 如果当前日期做核酸的人数大于等于 k,则天数加 1
if (count >= k) {
++totalDays;
}
}
cout << totalDays << endl;
return 0;
}