公共钥匙盒

发布时间 2023-12-27 11:03:00作者: 小菜碟子

算法思想:根据时间进程,将取走钥匙和归还钥匙分别视为两种事件放入vector中,并将vector按照先时间先后再还取的顺序进行排序。每次取出vector中一个元素对钥匙序列进行更新,最后输出钥匙序列。

主要/核心函数分析:根据时间进程,将取走钥匙和归还钥匙分别视为两种事件放入vector中,并将vector按照先时间先后再还取的顺序进行排序。

测试数据:

5 2

4 3 3

2 2 7

运行结果:

1 4 3 2 5

 1 #include <iostream>
 2 #include<vector>
 3 #include <algorithm>
 4 #include <fstream>
 5 
 6 using namespace std;
 7 
 8 struct issue
 9 {
10     int keynum;//操作的钥匙
11     int time;//操作时间
12     int flag;//1为取,0为还
13     issue(int key, int t, int f) :keynum(key), time(t), flag(f) {};
14 };
15 
16 int N,K;
17 vector<issue>vac;//记录事件数组
18 vector<int>key;//钥匙盒
19 
20 bool cmp(const issue& a, const issue& b)//自定义排序
21 {
22     if (a.time != b.time)//按时间从小到大排序
23         return a.time < b.time;
24     else if (a.flag != b.flag)//如果时间相同,取的操作优先于还的操作
25         return a.flag < b.flag;
26     else
27         return a.keynum < b.keynum;//如果时间和操作类型都相同,按钥匙编号从小到大排序
28 }
29 
30 int main()
31 {
32     fstream fp;
33     fp.open("test.txt", ios::in);
34 
35     int K;
36     fp >> N>>K;
37 
38     for (int i = 1; i <= K; i++)
39     {
40         int k, time1, time2;
41         fp>> k >> time1 >> time2;
42         vac.push_back(issue(k, time1, 1));
43         vac.push_back(issue(k, time1 + time2, 0));
44     }
45     fp.close();
46 
47     //初始化钥匙序列
48     for (int i = 1; i <= N; i++)
49         key.push_back( i);
50 
51     //排序
52     sort(vac.begin(), vac.end(), cmp);
53 
54     //开始操作
55     for (int i = 0; i < vac.size(); i++)
56     {
57         if (vac[i].flag == 1)//取钥匙
58         {
59             //找寻钥匙在不在盒子里
60             auto it=find(key.begin(),key.end(),vac[i].keynum);
61             if (it != key.end())
62                 *it = 0;//取走
63         }
64         else
65         {
66             //找最左边的
67             auto it = find(key.begin(), key.end(), 0);
68             *it = vac[i].keynum;//放入
69         }
70     }
71 
72     for (int i = 0; i < N; i++)
73         cout << key[i] << " ";
74     return 0;
75 }