201709-2 | |
试题名称: | 公共钥匙盒 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: |
问题描述 有一个学校的老师共用N个教室,按照规定,所有的钥匙都必须放在公共钥匙盒里,老师不能带钥匙回家。每次老师上课前,都从公共钥匙盒里找到自己上课的教室的钥匙去开门,上完课后,再将钥匙放回到钥匙盒中。 输入格式 输入的第一行包含两个整数N, K。 输出格式 输出一行,包含N个整数,相邻整数间用一个空格分隔,依次表示每个挂钩上挂的钥匙编号。 样例输入 5 2 样例输出 1 4 3 2 5 样例说明 第一位老师从时刻3开始使用4号教室的钥匙,使用3单位时间,所以在时刻6还钥匙。第二位老师从时刻2开始使用钥匙,使用7单位时间,所以在时刻9还钥匙。 样例输入 5 7 样例输出 1 2 3 5 4 评测用例规模与约定 对于30%的评测用例,1 ≤ N, K ≤ 10, 1 ≤ w ≤ N, 1 ≤ s, c ≤ 30; |
这题好像没什么算法,就直接模拟一遍就好了,主要是利用sort函数的强大之处,C++的sort函数还是很牛逼的,把借钥匙的时间和换钥匙的时间分别存在数组中,然后遍历时间就好了
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
struct returntime {
int classnum;
int finishtime;
}rmap[1200];
struct borrowtime {
int classnum;
int starttime;
}bmap[1200];
int key[1200];
bool cmp(struct returntime a, struct returntime b) {
if (a.finishtime != b.finishtime)return a.finishtime < b.finishtime;
return a.classnum < b.classnum;
}
bool cmp1(struct borrowtime a, struct borrowtime b) {
if (a.starttime != b.starttime)return a.starttime < b.starttime;
return a.classnum != b.classnum;
}
int main()
{
int n, k;
int duringtime, endtime, time;
int rindex = 0, bindex = 0;
while (cin >> n >> k) {
for (int i = 0; i < k; i++) {
cin >> rmap[i].classnum >> bmap[i].starttime >> duringtime;
rmap[i].finishtime = bmap[i].starttime + duringtime;
bmap[i].classnum = rmap[i].classnum;
}
for (int i = 1; i <= n; i++)key[i] = i;
sort(rmap, rmap + k, cmp);
sort(bmap, bmap + k, cmp1);
endtime = max(rmap[k - 1].finishtime, bmap[k - 1].starttime);
time = 0;
while (time <= endtime) {
while(rmap[rindex].finishtime == time && rindex < k) {
for (int i = 1; i <= n; i++)
if (key[i] == 0) {
key[i] = rmap[rindex].classnum;
break;
}
rindex++;
}
while (bmap[bindex].starttime == time && bindex < k) {
for (int i = 1; i <= n; i++)
if (key[i] == bmap[bindex].classnum) {
key[i] = 0;
break;
}
bindex++;
}
time++;
}
for (int i = 1; i <= n; i++) {
cout << key[i] << ' ';
}
cout << endl;
}
return 0;
}