(1)题目描述
(2)算法思想
三个需要注意顺序的地方:
- 取钥匙时间先后;
- 同一时间先还后取;
- 同一时间还序号小者优先。
根据这三个原则进行模拟即可,我在此处先按钥匙编号从小到大进行了排序,在同一时间还钥匙时即不需额外控制序号小者优先的原则。
(3)代码实现
#include<iostream>
#include<algorithm>
using namespace std;
struct teacher {
int id;
int end;
int begin;
};
bool cmp(teacher t1, teacher t2) {
return t1.id<t2.id;
}
int main() {
int N,K;
cin>>N>>K;
int key[N+1];
teacher T[K];
int maxend=0;
int minbeg=100000;
for(int i=1; i<=N; i++)
key[i]=i;
for(int i=0; i<K; i++) {
int period;
cin>>T[i].id>>T[i].begin>>period;
T[i].end=T[i].begin+period;
if(T[i].begin<minbeg)
minbeg=T[i].begin;
if(T[i].end>maxend)
maxend=T[i].end;
}
sort(T,T+K,cmp);
for(int t=minbeg; t<=maxend; t++) {
for(int i=0; i<K; i++) {
if(T[i].end==t) {
for(int j=1; j<=N; j++) {
if(key[j]==0) {
key[j]=T[i].id;
break;
}
}
}
}
for(int i=0; i<K; i++) {
if(T[i].begin==t) {
for(int j=1; j<=N; j++) {
if(key[j]==T[i].id) {
key[j]=0;
break;
}
}
}
}
}
for(int i=1; i<=N; i++)
cout<<key[i]<<" ";
return 0;
}