201709-2 公共钥匙盒
题目
思路
设置两个结构数组,分别表示取钥匙和还钥匙,当然也可以设成一个数组,用flag标识。按时间排序,然后使用双指针扫描两个数组,进行相应操作。数组a[i]表示第i个位置上的钥匙序号,0表示位置为空。
AC代码如下
#include<cstdio>
#include<algorithm>
using namespace std;
struct node{
int x,t;//序号,时间
friend bool operator < (node na,node nb){
if(na.t!=nb.t) return na.t<nb.t;
else return na.x<nb.x;//同时还则小序号优先
}
}node gt[1005],retn[1005];//以后可别取get这样的名了
int main(){
int n,k,a[1005],w,s,c;
scanf("%d%d",&n,&k);
for(int i=0;i<k;i++){
scanf("%d%d%d",&w,&s,&c);
gt[i].x=w,gt[i].t=s;
retn[i].x=w,retn[i].t=c+s;//注意c是持续的时间,不是还钥匙时间
}
sort(gt,gt+k);
sort(retn,retn+k);
for(int i=1;i<=n;i++) a[i]=i;
int i=0,j=0,space=0;
while(i<k&&j<k){
while(i<k&>[i].t<retn[j].t){
for(int l=1;l<=n;l++){
if(a[l]==gt[i].x){
a[l]=0;
space=min(space,l);//用以优化找空位的时间
break;
}
}
i++;
}
while(j<k&&(i==k||gt[i].t>=retn[j].t)){//注意i==k的情况
for(int l=space;l<=n;l++){
if(a[l]==0){
a[l]=retn[j].x;
break;
}
}
j++;
}
}
for(int i=1;i<=n;i++) printf("%d ",a[i]);
return 0;
}