题目:http://118.190.20.162/view.page?gpid=T62
解题思路:
/*
1.把钥匙取走,钥匙位置为空,
2.把钥匙放回{
放回时间
不同时{
越早越先还
}
同时,{
1)放钥匙{
编号小的先还
}
2)取钥匙和放钥匙{
先放
后取
}
}
钥匙位置被占
}*/
代码:
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=1005;
struct key
{
int id;
int time;
int flag;//take 0,back 1
};
bool cmp(key a,key b){
if(a.time!=b.time){
return a.time<b.time;
}
else if(a.flag!=b.flag)
{
return a.flag>b.flag;
}
else{
return a.id<b.id;
}
}
int main(){
int N,KK;
cin>>N>>KK;
int id,s,c;
vector<key>mykey;
for(int i=1;i<=KK;i++){
cin>>id>>s>>c;
key k;
k.id=id;
k.time=s;
k.flag=0;
mykey.push_back(k);
k.id=id;
k.time=s+c;
k.flag=1;
mykey.push_back(k);
}
sort(mykey.begin(),mykey.end(),cmp);
int pk[N+1];
for(int i=1;i<=N;i++)pk[i]=i;
for(int i=0;i<mykey.size();i++){
int id=mykey[i].id,flag=mykey[i].flag;
if(flag==0){
for(int j=1;j<=N;j++){
if(pk[j]==id){
pk[j]=0;
break;
}
}
}
else if(flag==1){
for(int pj=1;pj<=N;pj++){//从左往右
if(pk[pj]==0){
pk[pj]=id;
break;
}
}
}
}
for(int i=1;i<=N;i++){
cout<<pk[i];
if(i!=N) cout<<" ";
else cout<<endl;
}
return 0;
}