这题算法实在经典:先用1-N个数组元素保存钥匙,1-N bool型元素保存某号钥匙是否到了要还的时候了,1-K个结构体数组元素来保存老师的信息。利用时间来判断某一个时刻该还的和该借的,当某一个时刻要还的时候先遍历一遍,将要还的钥匙的编号打上标记,也就是使其为TRUE,这时候再从小遍历钥匙数组,是0的地方就直接插入进去,这样又保证了先从小的编号处开始还。借钥匙是将这个老师所需要的钥找到后使该位置的元素为0即可。从时刻来操作的话又使得每次实现了先还后借的需求。
#include <iostream>
using namespace std;
struct teacher{
int room;
int begin;
int end;
};
int main(){
int N,K;//N个钥匙(教室),K个老师
scanf("%d %d",&N,&K);
int key[1500]={0};
bool bKey[1500]={false};
struct teacher tea[K+1];
int i,j,temp;
int max=0;
for(i=1;i<=N;i++){
key[i]=i;
}
for(i=1;i<=K;i++){
cin>>tea[i].room>>tea[i].begin>>temp;
tea[i].end=tea[i].begin+temp;
if(tea[i].end>max){
max=tea[i].end;
}
}
int time=1;
while(time<=max){
for(i=1;i<=K;i++){//找出哪些老师该还钥匙了,就将该老师手里的钥匙对应的bool类型数组设置成true
if(tea[i].end==time){
bKey[tea[i].room]=true;
}
}
for(i=1;i<=N;i++){//将记录下来的钥匙归还
if(bKey[i]){
for(j=1;j<=N;j++){
if(key[j]==0){
key[j]=i;
bKey[i]=false;
break;
}
}
}
}
for(i=1;i<=K;i++){
if(tea[i].begin==time){
for(j=1;j<=N;j++){
if(key[j]==tea[i].room){
key[j]=0;
break;
}
}
}
}
time++;
}
for(i=1;i<=N;i++){
printf("%d ",key[i]);
}
}