您的位置:首页 > 其它

CCF CSP 201709-2:公共钥匙盒

2018-03-08 15:12 549 查看
  公共钥匙盒



个人思路:

        这道题主要考查模拟钥匙借还操作,需要按照题目所给规则的顺序来进行操作。我用二维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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: