题目![在这里插入图片描述](https://img-blog.csdnimg.cn/0599db465f244dac8872df203a7229ca.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBATmFuY2Uu,size_20,color_FFFFFF,t_70,g_se,x_16)
分析
其实把借和还看成两个部分,然后按时间排个序,再按着其他的要求,按顺序对钥匙盒子数组进行操作就行了,这样想就很简单
之前陷入了思维误区,各种循环判断,快被逼疯。害。
AC代码
#include<bits/stdc++.h>
using namespace std;
struct node {
int id;
int time;
int state;//0 拿 1 huan
};
bool cmp(node l,node r) {
if( l.time !=r.time )//按时间先后顺序排
return l.time <r.time ;
if(l.state!=r.state)//先还后借
return l.state >r.state ;
return l.id <r.id ;//编号
}
int main() {
int n,k;
cin>>n>>k;
int a[n];//a是盒子
for(int i=0; i<n; i++)
a[i]=i+1;//储存的key的编号
k*=2;
node b[k];//操作
for(int i=0; i<k; i+=2) {
cin>>b[i].id>>b[i].time;//取
b[i].state =0;
cin>>b[i+1].time;
b[i+1].time+=b[i].time;//还的时间
b[i+1].state =1;
b[i+1].id =b[i].id ;//钥匙编号
}
sort(b,b+k,cmp);
for(int i=0; i<k; i++) {//操作
if(b[i].state ==1) {//还
for(int j=0; j<n; j++) {//钥匙盒
if(a[j] ==-1) {
a[j]=b[i].id;//换入钥匙
break;
}
}
} else {//借
for(int j=0; j<n; j++) {
if(a[j]==b[i].id ) {
a[j]=-1;//钥匙盒空
break;
}
}
}
}
for(int i=0; i<n-1; i++) {//输出
cout<<a[i]<<" ";
}
cout<<a[n-1]<<endl;
}