CCF CSP 201709-2:公共钥匙盒

  公共钥匙盒


个人思路

        这道题主要考查模拟钥匙借还操作,需要按照题目所给规则的顺序来进行操作。我用二维vector来存储要操作的事件:

      vector< vector<int> > v(m, vector<int>(2));   //v[i][0]为时间;v[i][1]为操作钥匙号,正数为还,负数为借。 

然后自己写了个排序函数,按照题设规则来排列这些操作事件,最后只要按这个顺序直接操作就可以了。


代码如下:

#include <bits/stdc++.h>

using namespace std;

void swap(vector< vector<int> > &v, int i){
	int m = v[i][0], n = v[i][1];
	v[i][0] = v[i+1][0];
	v[i][1] = v[i+1][1];
	v[i+1][0] = m;
	v[i+1][1] = n;
}

//按题意借还的先后规则排序 
void v_sort(vector< vector<int> > &v){
	int n = v.size();
	for(int i = 0; i < n; i++){  //冒泡排序 
		for(int j = 0; j < n - i - 1; j++){
			if(v[j][0] > v[j+1][0]){   //时间小的先操作 
				swap(v, j);
			}
			else if(v[j][0] == v[j+1][0]){   //同一时间 
				if(v[j][1] > 0 && v[j+1][1] > 0 && v[j][1] > v[j+1][1]){  //同时还,小号的先 
					swap(v, j);
				}
				else if(v[j][1] < 0 && v[j+1][1] > 0){  //还钥匙先于借钥匙 
					swap(v, j);
				}	
			}	
		}
	}
}
//公共钥匙盒 
int main(){
	int n, k;
	cin >> n >> k;
	vector<int> box(n);   //初始化钥匙盒 
	for(int i = 0; i < n; i++){
		box[i] = i + 1;
	}
	int m = 2 * k;
	vector< vector<int> > v(m, vector<int>(2));   //v[i][0]为时间,v[i][1]为操作钥匙号 
	for(int i = 0; i < m; i += 2){    //初始化各项借还操作 
		int key, s, e;
		cin >> key >> s >> e;
		e += s;
		v[i][0] = s;
		v[i][1] = 0 - key;   //负数为借钥匙 
		v[i+1][0] = e;
		v[i+1][1] = key;	//正数为还钥匙 	
	}
	v_sort(v);
	for(int i = 0; i < m; i++){
		int k = v[i][1];
		
		if(k > 0){  //还钥匙k 
		   for(int i = 0; i < n; i++){
		   	    if(box[i] == 0){
		   	    	box[i] = k;
		   	    	break;
				}
		   }	
		}
		if(k < 0){  //借钥匙k 
		   for(int i = 0; i < n; i++){
		   	    if(box[i] + k == 0){
		   	    	box[i] = 0;
		   	    	break;
				}
		   }
		}
	}
	for(int i = 0; i < n; i++){
		cout << box[i] << " ";
	}
	return 0;		
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值