解题思路:
由于涉及到几个时间:上课时间与下课时间(上课时间+时长),所以我用的方法是暴力搜索,在下课时间中选取最大值tmp,在1-tmp间暴力搜索(时间复杂度是有点大,但是做出来就好啦,而且容易理解),这道题还有一个小细节就是:在许多人同时去还钥匙时,要按照钥匙的号码顺序还,所以我对钥匙号进行了排序(当然相应的上下课时间也要一起排序),然后就是我的代码啦!
#include <iostream>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
int key[n];
int a[m]; int come[m]; int back[m]; int tmp=0;int t;
for(int j=0;j<n;j++) //钥匙的序号
{
key[j]=j+1;
}
for(int i=0;i<m;i++)
{
cin>>a[i]>>come[i]>>back[i];
back[i]+=come[i];
if(tmp<back[i]) //找最大值
{
tmp=back[i];
}
}
for(int i=0;i<m;i++) //对钥匙号排序
{
for(int j=i;j<m;j++)
{
if(a[i]>a[j])
{
t=a[i]; a[i]=a[j]; a[j]=t;
t=come[i]; come[i]=come[j]; come[j]=t;
t=back[i]; back[i]=back[j]; back[j]=t;
}
}
}
for(int i=1;i<=tmp;i++) //暴力搜索
{
for(int j=0;j<m;j++) //先还钥匙
{
if(back[j]==i)
{
back[j]=0;
for(int p=0;p<n;p++)
{
if(key[p]==-1)
{
key[p]=a[j];
break;
}
}
}
}
for(int j=0;j<m;j++) //再拿钥匙
{
if(come[j]==i)
{
come[j]=0;
for(int p=0;p<n;p++)
{
if(key[p]==a[j])
{
key[p]=-1;
}
}
}
}
}
for(int q=0;q<n;q++) //输出hhh
{
if(q==0)
{
cout<<key[q];
}
else{
cout<<" "<<key[q];
}
}
}