代码如下:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct key{
int w; //钥匙号
int s; //钥匙开始使用时间
int e; //钥匙结束使用时间
key() {w=0, s=0, e=0;}
key(int ww, int ss, int ee):w(ww),s(ss),e(ee) {}
};
bool Order(key& k1, key& k2)
{
return k1.w < k2.w;
}
int main()
{
vector<key> info; //输入信息
vector<int> usefulTime; //有用的时间点,不用每分钟查一次
int pothook[1001] = {1}; //挂钩,
// pothook[i]=j 意味着第i(i>=1)个挂钩上的钥匙编号为j .若无钥匙,则j=0;
int N, K;
freopen("t1.txt","r", stdin);
cin>>N>>K;
for(int i=1; i<= N; i++) pothook[i] = i;
for(int i=0; i<K; i++)
{
int w,s,c;
cin>>w>>s>>c;
info.push_back(key(w,s,c+s));
usefulTime.push_back(s);
usefulTime.push_back(c+s);
}
sort(usefulTime.begin(), usefulTime.end());//排序
usefulTime.erase(unique(usefulTime.begin(), usefulTime.end()), usefulTime.end());
//去除重复元素
//依次看有用时间
for(int pp=0; pp< usefulTime.size(); pp++)
{
int t = usefulTime[pp];
//先还钥匙
vector<key> vk; //还的钥匙 ,可能多个
for(int j=0; j< info.size(); j++)
{
if(info[j].e == t)
vk.push_back(info[j]);
}
sort(vk.begin(), vk.end(), Order);//按钥匙号排序
for(int k=0; k<vk.size(); k++)
{
for(int p=1; p<= N; p++)
{
if(!pothook[p])
{
pothook[p] = vk[k].w;
//cout<<"ti:"<<t<<" pothook["<<p<<"]:"<<pothook[p]<<endl;
break;
}
}
}
//借钥匙,相应位置变成零
for(int p=0; p< info.size(); p++)
{
if(info[p].s == t)
{
int pos;
for(int i=1; i<=N; i++)
if(pothook[i] == info[p].w)
{
pos = i;
break;
}
pothook[pos] = 0;
//cout<<"to:"<<t<<" pothook["<<info[p].w<<"]:"<<pothook[info[p].w]<<endl;
}
}
}
for(int i=1; i<=N; ++i)
cout<< pothook[i] << " ";
return 0;
}