CCF201709-2 公共钥匙盒

#include

using namespace std;

const int N=1000;

struct Node{

int no;//钥匙编号

int t;//时间

int type;//状态 0借 1还

bool operator<(const Node &a)const

{ //按时间从小到大排序 ,如果时间相同,再按照钥匙编号由小到大排序

return (t==a.t)?(no<a.no):(t<a.t);

}

}a[2*N];

int main()

{

int n,k,w,s,c,m=0,i,j;

int ans[N+1];//ans模拟钥匙盒,ans[i]=0表示此位置为空

cin>>n>>k;

for(i=1;i<=n;i++)

ans[i]=i;//初始化

while(k–){

cin>>w>>s>>c;

a[m].no=w;

a[m].t=s;

a[m++].type=0;//借

a[m].no=w;

a[m].t=s+c;

a[m++].type=1;//还

}

sort(a,a+m);

for(i=0;i<m;i=j){//i=j是为了保证 i=下个一时间

for(j=i;j<m&&a[j].t==a[i].t;j++);

//先处理同一时间还钥匙 ,编号小的优先还 ,由于时间相同,钥匙编号由小到大排序 故顺序处理即可

for(int t=i;t<j;t++)

if(a[t].type==1){

int pos;

for(pos=1;pos<=n&&ans[pos];pos++);

ans[pos]=a[t].no;

}

// 处理同一时间借钥匙

for(int t=i;t<j;t++)

if(a[t].type==0){

int no=a[t].no;

int pos;

for(pos=1;pos<=n;pos++)//找到要借的钥匙的位置,并标记为借走

if(ans[pos]==no){

ans[pos]=0;

break;

}

}

}
for(i=1;i<=n;i++)
cout<<ans[i]<<" ";
cout<<endl;
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值