标签:for sort 更新 输入 const namespace using return 接受
题意:银行有K个窗口用于服务,给出所有人的达到时间T和服务时间P,计算所有被服务的客户的平均等待时间。任何客户的服务时间不得超过60分钟。早于08:00到的,要等到08:00;在17:00:01及之后到的,不给予服务,不参与计算平均等待时间。
思路:首先,对所有顾客的到达时间进行排序;其次,令数组windows[i]表示窗口i当前顾客的结束服务的时间,初始化为08:00,这样的话,每次要安排下一个顾客前往某窗口接受服务时,就遍历所有窗口,找出当前最快结束的那个窗口(记为minidx),然后让这位顾客去minidx号窗口接受服务。顾客的等待时间分为两种情况:1)若顾客到达的时间比较早,早于当前窗口的最早结束的时间,如当前窗口结束前一个人的服务时间是08:16,但是下一位顾客08:01(其服务时间是60分钟)就到了,则该顾客需等待15分钟,而该窗口的最早结束服务的时间就更新为08:16+60min;2)若顾客到达的时间比较晚,晚于当前窗口的最早结束的时间,如当前窗口结束前一个人的服务时间是08:16,但是下一位顾客08:20(其服务时间是60分钟)才到,则该顾客无需等待,相应的,该窗口的最早结束服务的时间就更新为08:20+60min,注意区别,这种情况下,时间更新为该顾客的到达时间+其服务时长!
一些注意点:
1.为了时间比较的方便,统一化成以秒为单位;
2.因为任何客户的服务时间不得超过60分钟,故在数据输入时就先做好判断,如果某个顾客服务时间超过60分钟的,直接截断成60分钟;
3.因为在17:00:01及之后到的,不给予服务,不参与计算平均等待时间,即无效数据,故在数据输入时就先剔除;
我的主要问题出在了更新状态未考虑周全,即上面所说的情况(2)。
代码:
#include <cstdio> #include <algorithm> using namespace std; const int START_TIME=8*3600; const int END_TIME=17*3600; //时间均以秒为单位 struct Customer{ int arrivedTime; int servedTime; }cus[10005]; int totalWait=0;//总的等待时间 int windows[105];//表示窗口i的最早结束服务的时间,初始化为START_TIME bool cmp(Customer a,Customer b){ return a.arrivedTime<b.arrivedTime; } int main() { //freopen("pat.txt","r",stdin); fill(windows,windows+105,START_TIME);//初始化 int n,k,validCnt=0; scanf("%d%d",&n,&k); int hh,mm,ss,serve; for(int i=0;i<n;i++){ scanf("%d:%d:%d%d",&hh,&mm,&ss,&serve); if(hh*3600+mm*60+ss>END_TIME) continue;//如果到达时间超过下班时间,则无效 cus[validCnt].arrivedTime=hh*3600+mm*60+ss; cus[validCnt++].servedTime=(serve>60?60:serve)*60; } sort(cus,cus+validCnt,cmp); int idx=0; while(idx<validCnt){ //遍历所有窗口,寻找当前哪个窗口最先有空 int minidx=-1,minTime=0x7fffffff; for(int i=0;i<k;i++){ if(windows[i]<minTime){ minTime=windows[i]; minidx=i; } }
//更新 if(windows[minidx]>cus[idx].arrivedTime){ totalWait+=windows[minidx]-cus[idx].arrivedTime; windows[minidx]+=cus[idx].servedTime; }else{ windows[minidx]=cus[idx].arrivedTime+cus[idx].servedTime;//关键,容易忽略 } idx++; } printf("%.1f",totalWait/60.0/validCnt); return 0; }
标签:for sort 更新 输入 const namespace using return 接受
原文地址:https://www.cnblogs.com/kkmjy/p/9559458.html