L2-034 口罩发放
题目链接
题意
思路
坑点
代码
#include<bits/stdc++.h>
using namespace std;
struct name
{
string name;//姓名
string id;//身份证
int body;//身体状况
string time;//时间
int xu;//按照表格顺序
}a[30010],b[30010];//存放的全部领取口罩的人,病人
bool cmp(name x,name y)
{
if(x.time!=y.time)//全部领取口罩的人输出顺序
{//如果时间不同
return x.time<y.time;//就按照早到的排序
}
else
{
return x.xu<y.xu;//否则就按照表格顺序排序
}
}
bool check(string id)//判断身份证号是否符合
{
if(id.size()!=18)//身份证必须为18位
{
return false;//0
}
for(int i=0;i<18;i++)//身份证中的数字全部为数字;
{
if(id[i]<'0'||id[i]>'9')
{
return false;//0
}
}
return true;
}
map<string,int>mp,mp2;//记录出现的状态;
int main()
{
int d,p;
cin>>d>>p;
int t,s;
int sum=0;//1
for(int i=1;i<=d;i++)//4
{
cin>>t>>s;
for(int j=1;j<=t;j++)
{
cin>>a[j].name>>a[j].id>>a[j].body>>a[j].time;//依次输入信息;
a[j].xu=j;//记录表格顺序;
}
for(int j=1;j<=t;j++)//先判断身体状况为1的
{
if(check(a[j].id)!=true)//不正确
{
continue;
}
if(a[j].body==1&&mp[a[j].id]==0)//身体状况为1同时还没有领取口罩的;
{
mp[a[j].id]=1;//记录当前病人领取口罩的天数,以便后面判断隔几天是否可以该领取口罩领取
sum++;//病人数量
b[sum].name=a[j].name;//将当前病人的姓名和身份张存入b数组中;
b[sum].id=a[j].id;
}
}
sort(a+1,a+1+t,cmp);
int ren=0;//当天申请的人数
for(int j=1;j<=t;j++)
{
if(check(a[j].id)!=true)
{
continue;
}
if(ren<s)// 当申请的人数小于口罩的数量就可以进入循环
{
if(mp2[a[j].id]==0||mp2[a[j].id]+p+1<=i)//1+2+1=4
{
mp2[a[j].id]=i;//领过了,表示第几天领的
ren++;
cout<<a[j].name<<" "<<a[j].id<<endl;
}
}
}
}
for(int k=1;k<=sum;k++)//最后输出病人的信息;
{
cout<<b[k].name<<" "<<b[k].id<<endl;
}
return 0;
}