当前位置: 首页 > news >正文

L2-034 口罩发放

L2-034 口罩发放 - 团体程序设计天梯赛-练习集 (pintia.cn)

题解

1、数据结构定义

(1)People 结构体,用于存储申请人的各项信息

struct People{ int sx; // 申请顺序 string name; // 姓名 string id; // 身份证号 int flag; // 身体情况 int h; // 时针 int m; // 分针 int day; // 申请成功的那天 };

(2)map<string, int> lastSuccessDay 来记录合法身份证的人申请到口罩的日期,便于判断是否满足间隔要求。

(3)vector<People> sickPeople 记录有合法记录且身体状况为 1 的申请人。

2、数据读取

  • 读取天数 D 和间隔天数 P

  • 针对每一天的数据,先读取当天的申请数量 T 和口罩发放名额 S

  • 依次读取每条申请信息,若身份证号合法,就将其存入 peo 向量;若申请人身体状况为 1 且未在 sickPeople 中出现过,就将其添加到 sickPeople 中。

3、数据筛选与排序:

  • 借助 is_valid_id 函数判断身份证号是否为 18 位数字。

  • 对当天的申请信息按提交时间排序,若提交时间相同,则按申请顺序排序。

4、口罩发放:

  • 遍历排序后的申请信息,若申请人未申请过口罩或者距离上次申请超过 P 天,就发放口罩,输出其姓名和身份证号,并更新 lastSuccessDay

5、结果输出:

  • 输出每一天的口罩发放记录。

  • 输出有合法记录且身体状况为 1 的申请人的姓名和身份证号。

代码
#include<bits/stdc++.h>
using namespace std;
struct People{
    int sx;         // 申请顺序
    string name;    // 姓名
    string id;      // 身份证号
    int flag;       // 身体情况
    int h;          // 时针
    int m;          // 分针
    int day;        // 申请成功的那天
};
//排序
bool cmp(People a, People b){
    if(a.h != b.h){
        return a.h < b.h;
    }else if(a.m != b.m){
        return a.m < b.m;
    }
    return a.sx < b.sx;
}
//判断是否是 18 位的数字
bool is_valid_id(string id){
    if(id.size() != 18) return false;
    for(char c : id){
        if(!isdigit(c)) return false;
    }
    return true;
}
int main(){
    int d, p;
    cin >> d >> p;
    map<string, int> lastSuccessDay; //记录合法身份证的人的id和他们申请到的口罩的日期
    vector<People> sickPeople;//记录有合法记录的、身体状况为 1 的申请人的姓名及身份证号
    for(int i = 1; i <= d; i++){
        int t, s;
        cin >> t >> s;
        vector<People> peo;
        for(int j = 0; j < t; j++){
            string a, b;
            int x, y, z;
            cin >> a >> b >> x;
            scanf("%d:%d", &y, &z);
            if(is_valid_id(b)){
                peo.push_back({j, a, b, x, y, z, 0});
                if(x == 1){
                    bool found = false;
                    for(auto& person : sickPeople){
                        if(person.id == b){
                            found = true;
                            break;
                        }
                    }
                    if(!found){
                        sickPeople.push_back({j, a, b, x, y, z, 0});
                    }
                }
            }
        }
        sort(peo.begin(), peo.end(), cmp);
        int given = 0;
        for(int j = 0; j < peo.size() && given < s; j++){
            if(lastSuccessDay.find(peo[j].id) == lastSuccessDay.end() || 
               i - lastSuccessDay[peo[j].id] > p){
                cout << peo[j].name << " " << peo[j].id << endl;
                lastSuccessDay[peo[j].id] = i;
                given++;
            }
        }
    }
    for(auto& person : sickPeople){
        cout << person.name << " " << person.id << endl;
    }
    return 0;
}

相关文章:

  • 网页制作软件 苹果竞价推广和seo的区别
  • 网站查询功能怎么做网页搜索优化seo
  • 网站怎么做中英文交互广州seo公司排名
  • 有哪些网站可以做简历seowhy论坛
  • 现在还做响应式网站吗东莞整站优化推广公司找火速
  • 怎么进入wordpress修改界面湛江百度seo公司
  • 太阳能晶片计数系统 源代码
  • 开源推荐#5:CloudFlare-ImgBed — 基于 CloudFlare Pages 的开源免费文件托管解决方案
  • Qt 元对象系统探秘:从 Q_OBJECT 到反射编程的魔法之旅
  • 商品详情 API 返回数据字段说明
  • Java基础 - 反射(2)
  • dd命令刻录CENT OS10 (.iso)光盘镜像文件到U盘
  • 基于深度学习模型去预测材料的吸声性能
  • pytorch软件封装
  • Spring基本概念
  • 模拟-与-现实协同训练:基于视觉机器人操控的简单方法
  • Netty之ChannelOutboundBuffer详解与实战
  • 虚拟dom工作原理以及渲染过程
  • Ruoyi-vue plus 5.2.2 flowble 结束节点异常错误
  • 基于CNN-BiLSTM-GRU的深度Q网络(Deep Q-Network,DQN)求解移动机器人路径规划,MATLAB代码
  • 30天学Java第八天——设计模式
  • mmrotate训练自己的数据(记录)
  • 使用多进程和 Socket 接收解析数据并推送到 Kafka 的高性能架构
  • 使用js创建img加载阿里云oss图片跨域的问题
  • opencv常用边缘检测算子示例
  • Java 并发-newFixedThreadPool