公共钥匙盒


from CCF-CSP 2017-09-2
Time limit:1s
Memory limit:256MB

公共钥匙盒_算法


公共钥匙盒_数据结构_02


将每个老师的信息分为两个操作,一个操作是取,一个操作时放,这样一共有2*k个操作,每个操作信息包括钥匙编号、时间、和存取。

struct Node{
int num; //钥匙编号
bool pick; //真为拿钥匙,假为还钥匙
int time; //时间
};

将这些操作按规则排序,然后逐一实现就可以了,排序规则为,时间小的优先,时间相同时,还钥匙优先,最后是编号优先。

bool cmp(Node a,Node b){//排序优先级为:时间小优先、还钥匙优先、编号小优先
if(a.time == b.time){
if(a.pick == b.pick)
return a.num < b.num;
return a.pick < b.pick;
}
return a.time < b.time;
}

ac代码:
#include<iostream>
#include<algorithm>
using namespace std;
int n,k,w,s,c; //如题所示
int note[1005]; //挂钩信息,如果没钥匙则标记为0,否则为钥匙编号
struct Node{
int num; //钥匙编号
bool pick; //真为拿钥匙,假为还钥匙
int time; //时间
}op[2005];
bool cmp(Node a,Node b){//排序优先级为:时间小优先、还钥匙优先、编号小优先
if(a.time == b.time){
if(a.pick == b.pick)
return a.num < b.num;
return a.pick < b.pick;
}
return a.time < b.time;
}
void init(){ //初始化,输入操作
cin>>n>>k;
for(int i = 1;i <= n;++i)
note[i] = i;
for(int i = 1;i <= k;++i)
cin>>w>>s>>c,op[i].num = op[i + k].num = w,op[i].pick = 1,op[i + k].pick = 0,op[i].time = s,op[i + k].time = s + c;
k *= 2;
sort(op + 1,op + k + 1,cmp);
}
void solve(){
for(int i = 1;i <= k;++i)
if(op[i].pick){ //取
for(int j = 1;;++j)
if(note[j] == op[i].num){
note[j] = 0;break;
}
}
else{ //还
for(int j = 1;;++j)
if(note[j] == 0){
note[j] = op[i].num;break;
}
}
for(int i = 1;i <= n;++i)
cout<<note[i]<<" ";
}
int main(){
init();
solve();
return 0;
}