当前位置: 首页 > 知识库问答 >
问题:

客户订单的最短平均等待时间

洪鹏海
2023-03-14

https://www.hackerrank.com/challenges/minimum-average-waiting-time/problem这是一个hackerrank问题的链接。我正在努力。它通过了一些测试用例,失败了一些。我在STL中使用了内置的优先级队列模板。代码如下,

#include<iostream>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
struct customer
{
    long long arrTime;
    long long cookTime;
    long long index;
};
void swap(customer& a,customer& b)
{
    customer &temp=a;
    a=b;
    b=temp;
}
bool compare( customer& a, customer& b)
{
    return a.arrTime<b.arrTime;
}
struct Compare1
{
    bool operator()(customer a,customer b)
    {
        return a.cookTime>b.cookTime;
    }
};
struct Compare2
{
    bool operator()(customer a,customer b)
    {
        return a.arrTime>b.arrTime;
    }
};
int main()
{
    vector<customer>c;
    vector<bool>done;
    long long n;
    cin>>n;
    for(long long i=0;i<n;i++)
    {
        customer cust;
        cin>>cust.arrTime;
        cin>>cust.cookTime;
        cust.index=i;
        c.push_back(cust);
        done.push_back(false);
    }
    sort(c.begin(),c.end(),compare);
    for(long long i=0;i<n-1;i++)
    {
        if(c[i].arrTime==c[i+1].arrTime && c[i].cookTime>c[i].cookTime)
        {
            swap(c[i],c[i+1]);
        }
    }
    priority_queue<customer,vector<customer>,Compare1> waitList;
    vector<long long>tat(n);
    vector<long long>ct(n);

    //next step- priority queue work starts
    long long count=0;
    long long totalTime=0;

    long long i=0;
    while(count!=n)
    {
        while(i<n && c[i].arrTime<=totalTime)
        {
            waitList.push(c[i]);
            i++;
        }
        customer next;
        if(!waitList.empty())
        {
            next=waitList.top();
            //cout<<"Job "<<next.index<<endl;
            waitList.pop();
            totalTime+=next.cookTime;
            ct[next.index]=totalTime;
            done[next.index]=true;  
            count++;

        }
        else if(i<n)
        {
            next=c[i];
            //cout<<"Job "<<next.index<<endl;
            i++;
            totalTime+=next.cookTime;
            ct[next.index]=totalTime;
            done[next.index]=true;  
            count++;
        }

    }
    long long sum=0;
    for(long long i=0;i<n;i++)
    {
        tat[i]=ct[i]-c[i].arrTime;
        sum+=tat[i];
    }
    cout<<sum/n;
    return 0;
}

我针对这个问题查找了一个叫做非抢占式优先调度的算法并实现了它。我的疑问:这个调度算法是解决问题的正确算法吗?我想知道我在实现调度算法时是否有任何错误。或者任何其他算法来实现它。这里是变量名称的描述,

tat数组代表工作的总周转时间

ct阵列代表完成时间。

我考虑过周转时间=非抢占式优先级调度的等待时间。

完成只是一个标志数组,用于指示标记为完成的进程。

arrTime 代表 到达时间。

CookTime代表烹饪时间(而不是实际算法中进程的爆发时间)

共有2个答案

程吕恭
2023-03-14

首先,对问题的重要方面进行简短解释。

    < li >订单的顺序可能不正确,这意味着它们可能没有按到达时间排序。所以,一定要先按到达时间排序。 < li >重要的是要认识到,厨师必须从等待的订单中选择烹饪时间最短的订单。这样,最终的等待时间总是最短的。 < li >此外,如果厨师没有要处理的订单,“当前”时间可以播放到下一个到达的订单。

除了接受的答案之外,C解决方案(因为问题用C标签标记)可能如下所示。

#include <bits/stdc++.h>

using namespace std;

struct customer {
    uint64_t arrivalTime;
    uint64_t cookingTime;    
};

/*
 * Complete the minimumAverage function below.
 */
uint64_t minimumAverage(std::deque<customer> clients, uint32_t numberOfClients) {
    auto compareByArrivalTime = [](customer const &client1, customer const &client2)
            {
                return client1.arrivalTime < client2.arrivalTime;
            };
    
    auto compareByCookingTime = [](const customer &client1, const customer &client2)
            {
                return client1.cookingTime > client2.cookingTime;
            };
    
    std::sort(clients.begin(), clients.end(), compareByArrivalTime);
    
    std::priority_queue<customer, std::vector<customer>, decltype(compareByCookingTime)> clientPriorityQueue(compareByCookingTime);
    
    uint64_t minWaitingTime = 0;
    uint64_t currentTime = clients.front().arrivalTime;
    for (auto servedClient = 1; servedClient <= numberOfClients; servedClient++) {
        while (!clients.empty() && currentTime >= clients.front().arrivalTime) {
            clientPriorityQueue.push(clients.front());
            clients.pop_front();
        } 
        
        customer bestClient = clientPriorityQueue.top();
        clientPriorityQueue.pop();
        
        uint64_t arrivalTime = bestClient.arrivalTime;
        uint64_t cookingTime = bestClient.cookingTime;
        minWaitingTime += (currentTime - arrivalTime + cookingTime);
        currentTime += cookingTime;
        
        if (!clients.empty()) {
            currentTime = std::max(currentTime, clients.front().arrivalTime);    
        }
    }
    
    return minWaitingTime / numberOfClients;
}

int main()
{
    uint32_t n;
    std::cin >> n;

    std::deque<customer> clients;
    for (auto i = 0; i < n; i++) {
        customer client;
        std::cin >> client.arrivalTime >> client.cookingTime;
        clients.push_back(client);
    }

    uint64_t result = minimumAverage(clients, n);

    std::cout << result << "\n";

    return 0;
}
赵征
2023-03-14

我想你错过了这样的情况,即有多个工作同时开始,所有这些工作都可以在下一个工作开始之前完成,这是非常小的。

例如

5
0 3
0 2
0 4
10 2
10 1

应该先查询前3个项目,并在查询其他2个项目之前处理完所有项目。这个案子在你的案子里会失败。

其他意见:

不需要用于在烹饪时间中排列向量的 for 循环,并且编码错误。

for(long long i=0;i<n-1;i++)
{
    if(c[i].arrTime==c[i+1].arrTime && c[i].cookTime>c[i].cookTime)
    {
        swap(c[i],c[i+1]);
    }
}

必须是' c[i]。烹饪时间

下面给出了一个传递所有用python编写的案例的工作解决方案以供参考。

import heapq

def getAvgWaitTime(n, cust):
    heap = []
    curTime = 0
    waitTime = 0
    cust = sorted(cust)
    i = 0

    while i < n:
        if curTime < cust[i][0]:
            curTime = cust[i][0]
        while i < n and (curTime >= cust[i][0]):
            heapq.heappush(heap, (cust[i][1], cust[i][0]))
            i += 1

        while (i < n) and curTime < cust[i][0] and len(heap) > 0:
            time, wait = calculateWaiting(heap, curTime)
            curTime += time
            waitTime += wait

    # Clear all the jobs
    while len(heap) > 0:
        time, wait = calculateWaiting(heap, curTime)
        curTime += time
        waitTime += wait

    return waitTime / n


def calculateWaiting(heap, curTime):
    wait = 0
    cur = heapq.heappop(heap)
    wait = curTime - cur[1] + cur[0] 
    return (cur[0], wait)


n = int(raw_input().strip())
cust = []
for i in range(n):
    ar = map(int, raw_input().strip().split(' '))
    cust.append((ar[0], ar[1]))


result = getAvgWaitTime(n, cust)
print result

希望对您有所帮助!

 类似资料:
  • 我的目标是计算抢占最短作业优先调度算法的平均等待时间。 假设作业的到达时间以2个单位为间隔,如0,2,4,6……即,第一个作业以0个单位进入,第二个作业在2个单位的时间后进入,以此类推。 我为我的程序测试了 3 个测试用例并得到了正确答案: 测试用例1: 作业:8,4,9,5 平均时间:6.5 测试用例2: 作业:7,4,1,4 平均时间:3 但是当我把一个有1000个作业的文件作为输入时,我得到

  • 我们知道优先级调度可以是抢占式的或非抢占式的。这两个中的哪一个通常平均等待时间最少??它们的性能会根据测试用例而变化吗??

  • 我正在尝试使用Altova XMLSpy和XQuery1.0为每个客户返回最近的订单。 在SQL中,查询如下所示: 它返回16行,但我无法获得类似于XQuery中的工作。 我尝试了多种不同的代码,我认为我得到的最接近的代码是: 对于XML从MS Access导出的糟糕的标记名表示歉意。 请救命!提前道谢。 编辑:在尝试JoeMFB的解决方案后,当我只需要最近的(或最大日期)时,我会收到每个客户的所

  • 给定下表,用于计算基于优先级的抢占式调度的流程和平均等待时间。 甘特图如下: 我有以下问题: 1) 周转时间是否 = 19 个单位? 2)如何计算平均等待时间?有公式吗? 3)如果很少有进程具有相同的优先级,该怎么办? 我是操作系统的新手。我看过其他一些类似的问题,但我不知道该怎么做。

  • 我想计算标记图中具有相同标签的节点的平均最短路径。例如,红色标记为A,黑色标记为B。 V_m是具有相同标签的顶点。n{i,j}是最短路径数,d{i,j}是测地距离。 我想使用Networkx来实现它。开始使用节点属性进行标记。 我可以用 现在我只想将键/值对保留在标签为例如“A”的位置。因此,我可以关注具有相同标签的节点。我希望它不是抽象的,但你有什么想法吗? 提前谢谢。

  • 使用普罗米修斯度量标准需要不同的思维方式。设计指标通常并不太困难。你能帮我设计订单处理系统的指标吗? 系统处理请求(如订单)。每个请求都包含许多要处理的项目。请求的处理时间可能在几秒钟到几小时之间。一个请求中的项目数在100万到100万之间变化。请求之间可能有一段时间。 我如何设计指标(计数器,量表,直方图,摘要?)普罗米修斯在白天(比如每10分钟)提供以下信息: 每个时间单位处理的平均项目数(请