ccf 认证 2017(公共钥匙盒)优先队列解决

解题思路:本题主要采用优先队列的思想解决问题。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<string>
using namespace std;

//使用优先队列解题,实现操作的排队需要重载运算符
//将归还 和获取操作加入到队列中
struct node{
     int num_key;
     int time;//时间点 g 为开始 R 为结束时间
     char op;//'G'为获取 R为返回钥匙

     //重载优先队列的运算符 只能重载<号
     bool operator <(node a) const
     {
          if(time!=a.time) //按照时间点从小到大
               return time>a.time;
          else if(op!=a.op) //时间点相同 R先操作
               return op<a.op;
          else
               return num_key>a.num_key;
     }
};



int main()
{
    int n,k;
    priority_queue<node> q;
    vector<int > k_seq;
    cin>>n>>k;
    for(int i=1;i<=n;i++)
          k_seq.push_back(i);

    node t;
     for(int i=0;i<k;i++)
     {
          int s,l;
          cin>>t.num_key>>s>>l;
          t.time=s;
          t.op='G';
          q.push(t);
          t.op='R';
          t.time=s+l;
          q.push(t);
     }
     while(!q.empty())
     {
          //获得队头
          node tt=q.top();
          if(tt.op=='G') //操作为获取
          {
               //查到 0 代表此处没有钥匙
              // vector 没有find 函数  int pos= k_seq.find(tt.num_key);
              for(int i=0;i<n;i++)
               if(k_seq[i]==tt.num_key)
              {
                   k_seq[i]=0;
                   break;
              }

          }
          else if(tt.op=='R'){
                    //返还钥匙 将找0 置为钥匙
               for(int j=0;j<n;j++)
                    if(k_seq[j]==0)
                         {
                              k_seq[j]=tt.num_key;
                              break;
                         }

          }
          q.pop();
     }

     for(int i=0;i<n;i++)
          cout<<k_seq[i]<<" ";


}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值