多處最優服務次序問題(貪心)

2021-09-29 14:54:47 字數 1337 閱讀 6933

問題描述

設有n個顧客等待服務,有k處可以提供這個服務,確定最優服務次序,讓顧客平均等待時間最少,這個平均等待時間就是顧客們等待的總和/n。

input

第一行輸入n,k,表示n名顧客,k處服務店

第二行分別輸入n個整數,表示每名顧客所需要的服務時間。

out輸出最少平均等待時間

輸入樣例

10 2

56 12 1 99 1000 234 33 55 99 812

輸出樣例
思路

貪心,對於本題,如果想讓大家等待的時間最少,就應該從小到大排序,讓需要服務時間最短的人先被服務。

模擬,有k處可以提供這個服務,剛開始k處都是空的,那就取前k個人被服務,剩下的n-k個就要等待,需要等待的時間是k個正在被服務人中最小的那個,因為它最先出來,比如他的時間是s,每次都模擬那個最先完成服務的人出來,k處剩下的k-1個人都應該減去s,然後放進去新的乙個人,不斷的模擬,累加上等待的時間。

剛開始輸入樣例的時候,等待時間就應該加上所有的輸入樣例,因為乙個人在被服務的時候,雖然他沒等別人,但是他等了自己哈哈哈

c++ ac

我們模擬成理髮店,我們都知道理髮店裡有很多座位可以理髮。

我們可以假設等待服務的這幫人都是剃頭的。會不會好想一點?

#include

#include

using namespace std;

//標記坐在理髮椅上的幾個人中最先結束的(服務時間剩的最少的)

int min_value;

//對應上面那個的,在理髮店中的位置

int min_loc;

//用於找到那個最先理好的

void

getmin

(vector<

int> v)}}

intmain()

//貪心從小到大排序,我們要貪的是理髮時間最短的最先被理髮,

//這樣大家平均等待時間就少了

sort

(arr,arr+n)

;//因為剛開始理髮店是空的,把前k個放進理髮店(vector)中

for(

int i=

0;i)//標記

int i=k;

while

(true)

}//讓那個最小值,也就是最先被服務完的出來,換成等著理髮的

v[min_loc]

=arr[i]

;//指標指向下乙個待服務的人

i++;//結束條件

if(i==n)

} cout

}

貪心 多處最優服務次序問題

問題 設有n個顧客同時等待一項服務,顧客i需要的服務時間為ti 1 i n 共有s處可以提供此項服務,應如何安排n個顧客需要的服務次序才能使平均等待時間達到最小?平均等待時間等於n個顧客等待服務的總時間除以n。輸入 第一行兩個正整數n和s表示n個顧客s處服務,接下來n個顧客需要的服務時間 輸出 平均...

多處最優服務次序問題(貪心)

問題描述 設有n個顧客同時等待一項服務。顧客 i 需要的服務時間是 ti,共有s處可以提供此項服務。應如何安排n個顧客的服務次序,才能使平均等待時間達到最小?平均等待時間使n個顧客等待服務的總時間的和除以n。輸入 10 2 56 12 1 99 1000 234 33 55 99 812 輸出 33...

多處最優服務次序問題

設有n個顧客同時等待一項服務,顧客i需要的服務時間為ti,1 i n,共有s處可以提供此項服務。應如何安排n個顧客的服務次序才能使平均等待時間達到最小?平均等待時間是n個顧客等待服務時間的總和除以n。給定的n個顧客需要的服務時間和s的值,程式設計計算最優服務次序。輸入第一行有2個正整數n和s,表示有...