L2-034 口罩发放
题目链接
题意
![在这里插入图片描述](https://img-blog.csdnimg.cn/6867fe895a8d453bbe2405c614d29966.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQW15MzM0,size_20,color_FFFFFF,t_70,g_se,x_16)
思路
- 先用结构体存放信息并排序
2.因为前一次申请成功的时间是确定的,利用map存放申请成功时间,用于判断是否已经经过P天 - 判断身份证是否合理,再依次输出申请成功的信息和病人的信息
坑点
- 需要判断身份证的大小必须为18位,并且都为数字
- 下一次拿口罩的时间是p+i+1天
代码
#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)
{
return false;
}
for(int i=0;i<18;i++)
{
if(id[i]<'0'||id[i]>'9')
{
return false;
}
}
return true;
}
map<string,int>mp,mp2;
int main()
{
int d,p;
cin>>d>>p;
int t,s;
int sum=0;
for(int i=1;i<=d;i++)
{
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++)
{
if(check(a[j].id)!=true)
{
continue;
}
if(a[j].body==1&&mp[a[j].id]==0)
{
mp[a[j].id]=1;
sum++;
b[sum].name=a[j].name;
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)
{
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;
}