PAT 1017. Queueing at Bank (25)

来源:互联网 发布:python 运行shell命令 编辑:程序博客网 时间:2024/05/08 00:46

//一遍ac吐舌头

//做的比较仔细,按步骤输出调试了很多细节,最后提交一遍过~!#include<iostream>#include<cstdio>#include<vector>#include<algorithm>using namespace std;#define BEGIN 8*60*60#define END 17*60*60int n, k;struct customer{int arrive_time;int process_time;int waiting_time;};vector<customer> ctr;bool cmp(const customer& a, const customer& b){return a.arrive_time < b.arrive_time;}int cleartime[105] = { 0 };int i = 0, j = 0;int main(){cin >> n >> k;for (i = 0; i < n; i++){customer ctr_tmp;int hh, mm, ss; char ch;cin >> hh >> ch >> mm >> ch >> ss;ctr_tmp.arrive_time = hh * 60 * 60 + mm * 60 + ss;int m; cin >> m;ctr_tmp.process_time = 60 * m;ctr_tmp.waiting_time = 0;ctr.push_back(ctr_tmp);}sort(ctr.begin(), ctr.end(), cmp);i = 0;while (i < n&&ctr[i].arrive_time < BEGIN){ctr[i].waiting_time = BEGIN - ctr[i].arrive_time;ctr[i].arrive_time = BEGIN;i++;}j = n - 1;while (j >= 0 && ctr[j].arrive_time >= END){ctr.pop_back();j--;}int size = j + 1;//下面按照窗口数目进行第一轮入队for (j = 0; j < k&&j < size; j++){cleartime[j] = ctr[j].arrive_time + ctr[j].process_time;}for (; j < size; j++){//后面的客户依次入队办理int index = 0; int min_time = cleartime[0];for (int v = 0; v < k; v++){if (cleartime[v] < min_time){min_time = cleartime[v];index = v;}}if (min_time <= ctr[j].arrive_time)cleartime[index] = ctr[j].arrive_time + ctr[j].process_time;else{ctr[j].waiting_time += (min_time - ctr[j].arrive_time);cleartime[index] += ctr[j].process_time;}}float result = 0;for (int v = 0; v < size; v++){result += ctr[v].waiting_time;}result /= size;result /= 60;printf("%.1f", result);}

0 0