公共钥匙盒

39 篇文章 0 订阅
11 篇文章 0 订阅
该博客主要讨论了公共钥匙盒的算法问题,从CCF-CSP2017-09-2中提取,涉及操作排序和钥匙存取策略。通过对老师取还钥匙的操作进行排序,优先考虑时间小、还钥匙和编号小的操作,实现了钥匙管理的逻辑。代码实现包括操作结构体定义、排序函数和主要的解决函数。
摘要由CSDN通过智能技术生成

公共钥匙盒


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

在这里插入图片描述
在这里插入图片描述


将每个老师的信息分为两个操作,一个操作是取,一个操作时放,这样一共有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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alan_Lowe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值