CCF真题
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<climits>
#include<cstdbool>
#include<cmath>
using namespace std;
int main()
{
int N,k;
cin>>N>>k;
int EndTime=0;//还完所有钥匙的总时间
int n[1000];//每一个空格上挂的钥匙编号
int w[1000];//教室编号
int s[1000];//开始时刻
int c[1000];//使用时长
int t[1000];//每位老师归还钥匙的时间
//初始化每把钥匙放的位置
for(int i=0;i<N;i++)
n[i]=i+1;
for(int i=0;i<k;i++)
cin>>w[i]>>s[i]>>c[i];
//计算每一位老师归还钥匙的时间
for(int i=0;i<k;i++)
{
t[i]=s[i]+c[i];
if(EndTime<t[i])
EndTime=t[i];
}
for(int m=1;m<=EndTime;m++)//枚举每一个时间点。看有那些老师还钥匙
{
vector<int>teacher;
teacher.clear();
//统计在当前时间点归还钥匙的老师
for(int i=0;i<k;i++)
{
if(t[i]==m)
teacher.push_back(w[i]);
}
if(teacher.size()>1)//如果同一时间点有多名老师归还钥匙,排序
{
sort(teacher.begin(),teacher.end());
}
//如果只有一个老师归还钥匙,那么就直接放在最左边的位置
//如果有多个老师归还钥匙就按照编号从小到大归还
int idx2=0;
for(int p=0;p<N;p++)
if(n[p]==0&&idx2!=teacher.size())
n[p]=teacher[idx2++] ;
//如果当前时间点有老师借走钥匙
for(int i=0;i<k;i++)
{
if(s[i]==m)
{
for(int o=0;o<N;o++)
if(w[i]==n[o])
n[o]=0;
}
}
}
for(int i=0;i<N;i++)
cout<<n[i]<<" ";
return 0;
}