解题思路:本题主要采用优先队列的思想解决问题。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<string>
using namespace std;
//使用优先队列解题,实现操作的排队需要重载运算符
//将归还 和获取操作加入到队列中
struct node{
int num_key;
int time;//时间点 g 为开始 R 为结束时间
char op;//'G'为获取 R为返回钥匙
//重载优先队列的运算符 只能重载<号
bool operator <(node a) const
{
if(time!=a.time) //按照时间点从小到大
return time>a.time;
else if(op!=a.op) //时间点相同 R先操作
return op<a.op;
else
return num_key>a.num_key;
}
};
int main()
{
int n,k;
priority_queue<node> q;
vector<int > k_seq;
cin>>n>>k;
for(int i=1;i<=n;i++)
k_seq.push_back(i);
node t;
for(int i=0;i<k;i++)
{
int s,l;
cin>>t.num_key>>s>>l;
t.time=s;
t.op='G';
q.push(t);
t.op='R';
t.time=s+l;
q.push(t);
}
while(!q.empty())
{
//获得队头
node tt=q.top();
if(tt.op=='G') //操作为获取
{
//查到 0 代表此处没有钥匙
// vector 没有find 函数 int pos= k_seq.find(tt.num_key);
for(int i=0;i<n;i++)
if(k_seq[i]==tt.num_key)
{
k_seq[i]=0;
break;
}
}
else if(tt.op=='R'){
//返还钥匙 将找0 置为钥匙
for(int j=0;j<n;j++)
if(k_seq[j]==0)
{
k_seq[j]=tt.num_key;
break;
}
}
q.pop();
}
for(int i=0;i<n;i++)
cout<<k_seq[i]<<" ";
}