演算法設計與分析 貪心策略 最佳郵局設定問題

2021-08-18 21:13:07 字數 1431 閱讀 2181

//總是感覺生活很空虛,就只能寫寫部落格看看書上上課這樣子。想出去,去乙個遙遠的地方。

先來看一下題目:

有n戶人家坐落在從西向東的一條街上。從街西頭向東數,第i戶的房子與街西頭的距離是h[i]公尺,(1≤i≤n), h[1]< h[2] < h[3] … < h[n] ,假設街上沒有郵局。現在,要在街上建一些郵局使得任一戶人家到最近乙個郵局的距離不超過1000公尺。請設計乙個o(n)時間的演算法以確定最少需要見的郵局收,並給出每個郵局到街西頭的距離。

看到這道演算法題,我有點羨慕這條街的人,寄信肯定超級方便,但也不禁有疑問,這個年代還要不要設定這麼多郵局,因為不知道是不是還有很多人在寫信,但是我特想寫封信寄給她。驀然想起來那首《從前慢》,"從前的日色變得慢/車,馬,郵件都慢/一生只夠愛乙個人"。

正所謂一步乙個腳印,既然要建郵局,還是那麼多郵局,我們必然要從第乙個郵局建起,郵局我們就假設為乙個p陣列,int型,裡面儲存郵局距離街最西頭王大姐家菜地的距離。那麼,第乙個郵局便是p[1],回顧一下題目,我們需要確定最少的郵局數量,也就是說我們要讓郵局的存在效用最大化,即每個郵局的覆蓋範圍最廣,那麼對p[1]來講,必然是p[1]設立在h[1]+1000處時最為合適,附圖來說:

從圖裡面可以看出,p[1]設立在h[1]+1000處時覆蓋範圍最廣,在此點的右邊設立,不符合題意,第一戶人家距離郵局太遠,若在左邊,那麼範圍不夠大,會多出第一戶人家到菜地的一些距離,這個距離對郵局設立來說意義不大。將第乙個郵局設立之後,應當考慮p[2],p[3]...假若h[2]等一些戶人家在段1或者段2之中,那麼我們便無需再對這些人家考慮單獨設立郵局,直到距離p[1]+1000點最近且在此點東邊的下一戶人家重新開始考慮設立p[2],方法與h[1]和p[1]相同,以此類推到p[n]。

這裡要注意的是,按照演算法,最後一戶人家如果距離其左邊的郵局距離大於千公尺,那麼在其右邊千公尺處會設立乙個郵局,也就是在街的最東頭設立了乙個郵局,這就有點尷尬了,專門為最後一戶人家設立的還距離那麼遠。因此我們將此郵局設立在最後一戶人家附近即可。

下面給出**:

#include#define max 101

int post_office(int p,int h,int n)

} if(p[m]>h[n])

p[m]=h[n]; //最後乙個郵局不需要在最後一戶人家之外

return m;

}int main()

m=post_office(p,h,n);

printf("there are %d post office,there are:\n",m);

for(int i=1;i<=m;i++)

return 0;

}

演算法設計與分析 貪心演算法

time limit 1000 ms memory limit 65536 kib problem description 一輛汽車加滿油後可行駛n公里。旅途中有若干個加油站。設計乙個有效演算法,指出應在哪些加油站停靠加油,使沿途加油次數最少。並證明演算法能產生乙個最優解。對於給定的n和k個加油站位...

演算法設計與分析 貪心演算法

分解 將原問題求解過程劃分為連續的若干個決策階段 決策 在每乙個階段依據貪心策略進行貪心決策,得到區域性的最優解,並縮小待求解問題的規模 合併 將各個階段的區域性解合併為原問題的乙個全域性最優解 greedy c c是問題的輸入集合即候選集合 初始解集合為空集 while not solution ...

演算法設計與分析 貪心演算法

所謂貪心演算法是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的僅是在某種意義上的區域性最優解。貪心演算法不是對所有問題都能得到整體最優解,但對範圍相當廣泛的許多問題他能產生整體最優解或者是整體最優解的近似解。貪心演算法的基本思路如下 1.建立數學模型...