7-48 银行排队问题之单窗口“夹塞”版 (30分)--map,vector
1 #include <iostream> 2 #include<iomanip> 3 #include <map> 4 #include <string> 5 #include <cstring> 6 #include <queue> 7 #include <vector> 8 using namespace std; 9 10 int main() 11 { 12 double time = 0;//记录当前时间 13 double wait = 0;//记录总的等待时间 14 int N, M; 15 cin >> N >> M; 16 vector<string>v;//存放所有客户名字 17 map<string, int>grp;//朋友集合,map[s]=1说明s在第1组 18 map<string, bool>grp_flag;//标志是否在某个朋友集合内的 19 map<string, bool>fns_flag;//某人事务是否处理完成 20 map<string, double>reach;//到达时间 21 map<string, double>dur;//事务持续时间 22 for (int i = 0; i < M; i++) 23 { 24 int n; 25 cin >> n; 26 for (int j = 0; j < n; j++) 27 { 28 string s; 29 cin >> s; 30 grp[s] =i; 31 grp_flag[s] = true; 32 } 33 } 34 for (int i = 0; i < N; i++) 35 { 36 string s; 37 cin >> s; 38 cin >> reach[s] >> dur[s]; 39 v.push_back(s); 40 } 41 42 for (int i = 0; i < v.size(); i++) 43 { 44 if (!fns_flag[v[i]]) 45 { 46 fns_flag[v[i]]=true; 47 if(dur[v[i]]>60)dur[v[i]]=60; 48 cout << v[i] << endl; 49 if (time > reach[v[i]]) 50 wait += time-reach[v[i]]; 51 else 52 { 53 time = reach[v[i]]; 54 } 55 for (int j = 0; j < v.size(); j++) 56 { 57 if (i != j) 58 { 59 if (grp[v[j]] == grp[v[i]] && grp_flag[v[j]] && grp_flag[v[i]] && !fns_flag[v[j]]) 60 {/*一开始漏了最后一个条件,第三四个测试点没有通过,因为不能保证将朋友的 61 事务全部办理完,所以会有遗漏的朋友,当轮到遗漏的朋友自己排队完处理 62 事务的时候,又会把他的朋友的事务再处理一遍,导致重复。*/ 63 if (reach[v[j]] <= time + dur[v[i]]) 64 { 65 if (dur[v[j]] > 60)dur[v[j]] = 60; 66 wait += time + dur[v[i]] - reach[v[j]]; 67 dur[v[i]] += dur[v[j]]; 68 fns_flag[v[j]] = true; 69 cout << v[j] << endl; 70 } 71 } 72 } 73 } 74 time += dur[v[i]]; 75 } 76 } 77 cout << setprecision(1) << fixed<<wait /N; 78 return 0; 79 }