先上代码:
#include<iostream>
using namespace std;
struct Lists {
int keynum;
int time;
int op;
};
Lists list[2010];
int a[1005];
int main() {
int n, k;
cin >> n >> k;
int w, s, c;
for (int i = 1; i <= n; i++) a[i] = i;
for (int i = 1; i <= k; i++) {
cin >> w >> s >> c;
list[i].keynum = w;
list[i].time = s;
list[i].op = 0;
list[i + k].keynum = w;
list[i + k].time = s + c;
list[i + k].op = 1;
}
for (int i = 1; i <= 2 * k; i++) {
for (int j = 1; j <= 2 * k; j++) {
if (list[i].time < list[j].time) {
Lists a = list[i];
list[i] = list[j];
list[j] = a;
}
else if (list[i].time == list[j].time) {
if (list[i].op > list[j].op) {
Lists a = list[i];
list[i] = list[j];
list[j] = a;
}
else if (list[i].keynum <list[j].keynum) {
Lists a = list[i];
list[i] = list[j];
list[j] = a;
}
}
}
}
for (int i = 1; i <= 2 * k; i++) {
if (list[i].op == 0) {
for (int l = 1; l <= n; l++)
if (a[l] == list[i].keynum){
a[l] = 0;
break;
}
}
else if (list[i].op == 1) {
for (int m = 1; m <= n; m++)
if (a[m] == 0) {
a[m] = list[i].keynum;
break;
}
}
}
for (int l = 1; l <= n; l++)
cout <<a[l]<<" ";
return 0;
}
评测结果:
大致思路:
首先分析思路,只需要得到操作序列,按时间排序,就可以通过遍历操作序列来得到答案。
因此可以定义操作序列(x,y,z),x代表钥匙号,y代表操作时间,z代表动作(0表示取,1表示放回,z=0时的操作序列就很容易获得,x和y是每行三个数据的前两个数,而z=1时的操作时间y就是每行输入的第二个数+第三个数。
定义完操作序列,获得输入数据,然后按时间进行排序,这里还需要注意一点就是时间相同时,z=1(放回)优先,z也相等时,x值小优先。
排序完的数据直接用来处理钥匙序列,这里就不多说了。
祝各位都有进步hhhhhh~