CCF/CSP 201709-2 公共钥匙盒 代码

CCF/CSP 201709-2 公共钥匙盒 代码

c++代码注释版

#include<iostream>
#include<algorithm>
using namespace std;
int key[1001];
struct OP{
	int time; 
	int keyid;
	int even;
}op[100001];


bool cmp(OP op1, OP op2) {
	if (op1.time == op2.time) { // 先时间顺序 
		if (op1.even == op2.even) { // 再按事件的优先级,归还事件优先级高 
			return op1.keyid < op2.keyid; // 后按keyid 
		} else {
			return op1.even > op2.even;
		}
		
	}
	else {
		return op1.time < op2.time;
	}
		
}


int main() {
	int n, k;
	cin >> n >> k;
	// 初始化钥匙勾,index为位置, value为钥匙编号 keyid 
	for (int i = 0 ; i < n; i++) {
		key[i] = i+1;
	}
	// 按照时间生成操作事件 
	int opindex = 0;
	for (int j = 0; j < k; ++j) {
		int keyid, startTime,useTime,endTime;
		cin >> keyid >> startTime >> useTime;
		endTime = startTime + useTime;
		op[opindex].time = startTime;
		op[opindex].keyid = keyid;
		op[opindex].even = 1; // 借出事件 
		opindex++;
		op[opindex].time = endTime;
		op[opindex].keyid = keyid;
		op[opindex].even = 2; // 归还事件 
		opindex++;

	}
	// 按照特定顺讯进行排序 
	sort(op,op+opindex,cmp);
	// 按照事件发生顺讯进行模拟 
	for(int i = 0; i < opindex; ++i){
		int keyid = op[i].keyid;
		if (op[i].even == 1) {
			// 借出 
			for(int j = 0; j < n; ++j) {
				if (key[j] == keyid) { // 从前往后,找到该钥匙 
					key[j] = -1;
					break; 
				} 
			}
		}
		else {
			// 归还 
			for(int j = 0; j < n; ++j) {
				if(key[j] == -1) {//从前往后,找到第一空位即可放置 
					key[j] = keyid;
					break;
				} 
			
			} 
		}
	}	
	for (int i = 0; i < n; ++i) {
		cout << key[i] << " ";
	}
	return 0;
} 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值