原题链接:CSP 201709-2 公共钥匙盒
学习博客:CCF CSP 201709-2 公共钥匙盒 思路分析和经验总结
#include <bits/stdc++.h>
using namespace std;
struct teacher
{
int id;//钥匙编号
int t;//取钥匙和还钥匙的时间点
int type;//1为取钥匙 0为换钥匙
teacher(int a,int b,int c)
{
id=a; t=b; type=c;
}
//在结构体里就提前排好序
friend bool operator < (const teacher &t1,const teacher &t2)
{
if(t1.t!=t2.t)
return t1.t<t2.t;
else if(t1.t==t2.t && t1.type!=t2.type)
return t1.type<t2.type;//果同一时刻既有老师还钥匙又有老师取钥匙,则老师们会先将钥匙全还回去再取出
else if(t1.t==t2.t && t1.type==t2.type)
return t1.id<t2.id;//如果有多位老师还钥匙,则他们按钥匙编号从小到大的顺序还
}
};
int key[1010];
vector<teacher> tmp;
int main()
{
std::ios::sync_with_stdio(false);
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++)
{
key[i]=i;
}
while(k--)
{
//钥匙编号、开始上课的时间和上课的时长
int w,s,c;
cin>>w>>s>>c;
tmp.push_back(teacher(w,s,1));//取钥匙
tmp.push_back(teacher(w,s+c,0));//还钥匙
}
sort(tmp.begin(),tmp.end());//排序
for(int i=0;i<tmp.size();i++)
{
if(tmp[i].type==1)//取钥匙
{
for(int j=1;j<=n;j++)
{
if(key[j]==tmp[i].id)
{
key[j]=0;
break;
}
}
}
else //取钥匙
{
for(int j=1;j<=n;j++)
{
if(key[j]==0)
{
key[j]=tmp[i].id;
break;
}
}
}
}
for(int i=1;i<=n;i++)
{
cout<<key[i]<<" ";
}
return 0;
}