• [PAT] A1017 Queueing at Bank


    【思路】

    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 }

     

  • 相关阅读:
    网络七层模型
    datagaridview添加序号
    sqlserver查询数据库所有字段和表的关系
    Code Project精彩系列转
    操作不同线程中的控件
    PetaPoco数据读写并发时出错
    浮点型float数据强制转换成int整型
    PetaPoco微型ORM的使用错误记录
    EF出现基础提供程序在 Open 上失败
    Python中random模块
  • 原文地址:https://www.cnblogs.com/yue36/p/12314421.html
Copyright © 2020-2023  润新知