CCF 公共钥匙盒 C++ 201709-2

思路


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;
}

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值