[PAT] A1017 Queueing at Bank

tech2022-09-01  121

【思路】

1:将所有满足条件的(到来时间点在17点之前的)客户放入结构体中,结构体的长度就是需要服务的客户的个数。结构体按照到达时间排序。

2:wend数组表示某个窗口的结束时间,一开始所有窗口的值都为8点整。每一个客户到来的时候,选择最早结束时间的窗口。如果最早结束时间比客户到得还早,那么他一来就能被服务,更新wend的值;如果最早结束时间比他晚,他需要等待,累加等待的时间,然后更新wend的值。

【坑】

测试点5:需要服务的客户数validn可能为0。此时它不能作为除数,所以要分开写。

测试点1:validn可能比窗口数k还小,我先用了一个循环是处理在窗口还没满的情况的,循环次数应该是k和validn当中较小的值,一开始没注意,直接写为了k。

测试点4:题目说“It is assumed that no window can be occupied by a single customer for more than 1 hour.”一开始也没注意,但是后来发现测试数据并没有用上这个条件,不明白。拒绝服务会出错,啥都不处理或者是需要的时间大于60分钟的只服务60分钟之后不再处理了都可以过这个测试数据。个人觉得他的意思可能是如果服务时间大于60分钟,就只服务60分钟,之后也不管了。感觉是题目不严谨。

tips】

1:输入时间后直接转化为与00:00:00相差(或与08:00:00?但是有人到早的,不想出现负数嘿嘿)的分钟数(double类型),包括需要的时间和窗口处理结束时间wend都统一这么表示,就比较方便。

2:只需要计算平均等待时间,客户谁是谁不重要,但是要注意需要的服务时间need和到达时间arrive要跟着走,所以用结构体存了。

3:表达式计算中,加减连接的每一项都是double,才会返回double。如下函数,这些具体数字都必须手动写成小数的形式。

double TransTime(string a)

{

    return ((a[0] - '0') * 10 + a[1] - '0') * 60.0 + ((a[3] - '0') * 10 + a[4] - '0')*1.0 + ((a[6] - '0') * 10 + a[7] - '0') / 60.0;

}

【AC代码】

1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 #include<math.h> 5 #include<algorithm> 6 using namespace std; 7 #define N 10000 8 #define K 100 9 struct people { 10 double arrive; 11 double need; 12 }; 13 bool cmp(people a, people b) 14 { 15 return a.arrive < b.arrive; 16 } 17 double TransTime(string a) 18 { 19 return ((a[0] - '0') * 10 + a[1] - '0') * 60.0 + ((a[3] - '0') * 10 + a[4] - '0')*1.0 + ((a[6] - '0') * 10 + a[7] - '0') / 60.0; 20 } 21 int FindMin(double a[], int k) 22 { 23 double min = a[0]; 24 int imin = 0; 25 for (int i = 1; i < k; i++) 26 if (min > a[i]) 27 { 28 min = a[i]; 29 imin = i; 30 } 31 return imin; 32 } 33 34 int main() 35 { 36 int n, k; 37 cin >> n >> k; 38 int validn = n; 39 int i; 40 string time; 41 double wend[K]; 42 people client[N]; 43 for (i = 0; i < validn; i++) 44 { 45 cin >> time; 46 cin >> client[i].need; 47 //if (client[i].need > 60)client[i].need = 60; 48 if (time > "17:00:00") 49 { 50 i--; 51 validn--; 52 } 53 else 54 client[i].arrive = TransTime(time); 55 } 56 sort(client, client + validn, cmp); 57 /*for (i = 0; i < validn; i++) 58 cout << (double)client[i].arrive << " " << client[i].need << endl; 59 */ 60 61 double wait = 0.00; 62 for (i = 0; i < (k>validn?validn:k); i++) 63 { 64 if (client[i].arrive < 480)//8点前到了 65 { 66 wait += 480 - client[i].arrive; 67 wend[i] = 480 + client[i].need; 68 } 69 else 70 { 71 wend[i] = client[i].arrive + client[i].need; 72 } 73 } 74 while (i < validn) 75 { 76 int kmin = FindMin(wend, k); 77 double wendmin = wend[kmin]; 78 if (client[i].arrive < wendmin)//有空位之前到了 79 { 80 wait += wendmin - client[i].arrive; 81 wend[kmin] += client[i].need; 82 } 83 else 84 { 85 wend[kmin] = client[i].arrive + client[i].need; 86 } 87 i++; 88 } 89 if (validn == 0) 90 cout << "0.0"; 91 else printf("%.1f", wait / validn); 92 return 0; 93 }

 

最新回复(0)