公共钥匙盒
个人思路:
这道题主要考查模拟钥匙借还操作,需要按照题目所给规则的顺序来进行操作。我用二维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;
}