公共钥匙盒
算法思想:根据时间进程,将取走钥匙和归还钥匙分别视为两种事件放入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 }