题目详情 - L2-034 口罩发放 (25 分) (pintia.cn)
题目大意很简单,就是一些细节的处理非常恶心。不管是经历了多久,反正是搞出来了。。。
Code Segment:
#include<iostream>
#include<set>
#include<vector>
#include<string>
#include<cstdio>
#include<cstring>
#include<cctype>
#include<map>
#include<algorithm>
using namespace std;
struct node{
string name,id;
int con,time,idx;
};//存储各种信息
int cmp(const node &a,const node &b)
{
if(a.time==b.time)
return a.idx<b.idx;
return a.time<b.time;
}
int main()
{
int d,p,t,s,time,con,minute,i,j,k,ma;
char c[30],a[30];
vector<node> v,vp,vps;
map<string,int> mp;
set<string> ss;
scanf("%d%d",&d,&p);
for(i=1;i<=d;i++)
{
scanf("%d%d",&t,&s);
for(j=0;j<t;j++)
{
scanf("%s%s%d%d:%d",a,c,&con,&time,&minute);
if(strlen(c)==18)
{
for(k=0;c[k];k++)
if(!isdigit(c[k]))
break;
if(c[k])//还要判断每个字符是不是数字字符
continue;
node no;
no.name=string(a);
no.id=string(c);
no.con=con;
no.idx=j;
no.time=time*100+minute;
if(mp[no.id]==0||mp[no.id]+p<i)
{
v.emplace_back(no);
}
if(con)
{
if(!ss.count(no.id))
{
ss.insert(no.id);
vp.emplace_back(no);
}//按申请记录的顺序存储
}
}
}
sort(v.begin(),v.end(),cmp);
for(auto it=v.begin();it!=v.end()&&s>0;it++)
{
if(mp[it->id]!=i)
{
cout<<it->name<<" "<<it->id<<endl;
mp[it->id]=i;
s--;
}
}
v.clear();
}
for(auto it=vp.begin();it!=vp.end();it++)
cout<<it->name<<" "<<it->id<<endl;
}