

思路://需要用一个数组记录当前钥匙编号的序列,每一个时刻都要检查有没有拿走或返还,实时更新数组中钥匙的状态。
//钥匙被拿走则置0,同一个时刻如果有多把钥匙被返还,则需要先排序再依次插入空位。
//需要用一个数组记录当前钥匙编号的序列,每一个时刻都要检查有没有拿走或返还,实时更新数组中钥匙的状态。
//钥匙被拿走则置0,同一个时刻如果有多把钥匙被返还,则需要先排序再依次插入空位。
#include <iostream>
#include <set>
typedef struct point{
int num;
int s;//start time
int e;//end time
}point;
using namespace std;
int main()
{
int n,k,a,b,c;
cin >> n >> k;
int key[n+1];
point borrow[k];//borrow information
for(int i=1;i<=n;i++)//init key number
key[i]=i;
for(int j=0;j<k;j++)//borrow info
{
cin >> a >> b >> c;
borrow[j].num=a;
borrow[j].s=b;
borrow[j].e=b+c;
}
for(int i=1;i<10100;i++)//check every moment
{
set<int> temp;
//return first,borrow later
for(int j=0;j<k;j++)//save key number will be returned
{
if(borrow[j].e==i) temp.insert(borrow[j].num);
}
if(temp.size()!=0)//auto sort and return
{
for(set<int>::iterator it=temp.begin();it!=temp.end();it++)
{
for(int m=1;m<=n;m++)
{
if(key[m]==0)
{
key[m]=*it;
break;//be attention this row
}
}
}
}
for(int j=0;j<k;j++)//borrow,be attention that the series now is unorder
{
if(borrow[j].s==i)
{
for(int m=1;m<=n;m++)
{
if(key[m]==borrow[j].num)
{
key[m]=0;
break;//be attention this row
}
}
}
}
}
for(int i=1;i<=n;i++)
cout << key[i] << " ";
return 0;
}
注意:每个时刻都要更新一下钥匙状态;
break的使用。
本文介绍了一种使用C++实现的钥匙管理系统,通过动态数组和set数据结构,记录钥匙的状态变化,包括拿走和归还操作。关键步骤包括排序返还钥匙并更新序列。算法关注每个时刻的钥匙状态更新和操作效率。
2894

被折叠的 条评论
为什么被折叠?



