这道题非常考虑细节:
1.主要思路:将还、取钥匙抽象为两个事件,根据时间节点进行遍历;
2.教师的输入属性比较多,考虑设置结构体;
3.一定要注意读题可能存在多个老师同时还钥匙,需要按钥匙编号顺序从小到大顺序归还,不然你只能得到40分,别问我怎么知道的。
#include<iostream>
#include<algorithm>
using namespace std;
int n,k;
int key[1001];//钥匙挂钩
struct teacher//定义一个教师结构体
{
int id;//钥匙编号
int b;//开始上课时间
int l;//上课持续时间
int e;//上课结束时间
}t[1001];
int main()
{
int max=0;
cin>>n>>k;
for(int i=0;i<k;i++)
{
cin>>t[i].id>>t[i].b>>t[i].l;
t[i].e=t[i].b+t[i].l;//结束时间等于开始时间+持续时间
if(t[i].e>max)
max=t[i].e;//max是最后一个老师还钥匙的时间
}
for(int i=1;i<=n;i++)
{
key[i]=i;//初始钥匙按序号排列
}
for(int i=1;i<=max;i++)
{
int c[1001];//记录可以同时还的钥匙编号 (可能存在多个老师同时还钥匙,需要按钥匙编号顺序从小到大顺序归还)
int cc=0;//记录归还钥匙的数量
for(int j=0;j<k;j++)
{
if(t[j].e==i)//此时刻时间等于某老师下课还钥匙时间
{
c[cc]=t[j].id;//将此老师即将归还的钥匙编号放进c[cc]
cc++;
}
}
sort(c,c+cc);//把可以归还的钥匙的编号从小到大排列
for(int j=0;j<cc;j++)
{
for(int m=1;m<=n;m++)
{
if(key[m]==0)
{
key[m]=c[j];//按从小到大顺序依次将钥匙放进目前序号最小的空钥匙悬挂位置上
break;
}
}
}
for(int j=0;j<k;j++)
{
if(t[j].b==i)
for(int m=1;m<=n;m++)
{
if(key[m]==t[j].id)
key[m]=0;//取钥匙时将原本该钥匙悬挂处的数组值(即钥匙编号)置为0,同样,归还时将匙悬挂处的数组值置为归还的钥匙编号
}
}
}
for(int i=1;i<=n;i++)
{
cout<<key[i]<<" ";
}
return 0;
}