思路
1.用队列把输入数据进行处理排序,time小的先执行;
2.time相同的,flag小的先执行(因为flag=1是借钥匙,flag=0是还钥匙);
3.time,flag都相同的,key小的先执行(因为同时还钥匙,先从编号小的开始还);
eg:
开始时第二个样例,压栈完
1 1 1
1 15 0
3 3 1
3 15 0
1 15 1
1 27 0
2 7 1
2 27 0
3 18 1
3 30 0
4 21 1
4 40 0
5 30 1
5 39 0
按照前面三个规则排序完(从上向下执行)
1 1 1
3 3 1
2 7 1
1 15 0
3 15 0
1 15 0
3 15 0
1 15 1
3 18 1
4 21 1
1 27 0
2 27 0
3 30 0
5 30 1
5 39 0
4 40 0
源代码C++
#include<iostream>
#include<queue>
using namespace std;
struct node{
int key;
int time;
int flag;
bool operator <(const node &a) const//重新<符号
{
if(time!=a.time) return time>a.time;//小的优先级高
else if(flag!=a.flag) return flag>a.flag;
else return key>a.key;
}
};
priority_queue<node> q;//优先队列
int main()
{
int box[1010];
int n,k,w,s,c;
cin>>n>>k;
int i,j;
for(i=0;i<n;i++)
{
box[i]=i+1;
}
node x;
node temp;
for(i=0;i<k;i++)
{
cin>>w>>s>>c;
x.key=w;
x.time=s;
x.flag=1;//取钥匙
q.push(x);
x.key=w;
x.time=s+c;
x.flag=0;//还钥匙
q.push(x);
}
while(!q.empty())
{
temp=q.top();
q.pop();
if(temp.flag==1)//取钥匙
{
for(i=0;i<n;i++)
{
if(temp.key==box[i])
{
box[i]=0;
break;
}
}
}
else//还钥匙
{
for(j=0;j<n;j++)
{
if(box[j]==0)
{
box[j]=temp.key;
break;
}
}
}
}
for(i=0;i<n;i++)
{
cout<<box[i]<<" ";
}
cout<<endl;
return 0;
}