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代表烹饪时间(而不是实际算法中进程的爆发时间)
首先,对问题的重要方面进行简短解释。
除了接受的答案之外,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;
}
我想你错过了这样的情况,即有多个工作同时开始,所有这些工作都可以在下一个工作开始之前完成,这是非常小的。
例如
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分钟)提供以下信息: 每个时间单位处理的平均项目数(请