問題描述
棟棟最近開了一家餐飲連鎖店,提供外賣服務。隨著連鎖店越來越多,怎麼合理的給客戶送餐成為了乙個急需解決的問題。
棟棟的連鎖店所在的區域可以看成是乙個n×n的方格圖(如下圖所示),方格的格點上的位置上可能包含棟棟的分店(綠色標註)或者客戶(藍色標註),有一些格點是不能經過的(紅色標註)。
方格圖中的線表示可以行走的道路,相鄰兩個格點的距離為1。棟棟要送餐必須走可以行走的道路,而且不能經過紅色標註的點。
送餐的主要成本體現在路上所花的時間,每乙份餐每走乙個單位的距離需要花費1塊錢。每個客戶的需求都可以由棟棟的任意分店配送,每個分店沒有配送總量的限制。
現在你得到了棟棟的客戶的需求,請問在最優的送餐方式下,送這些餐需要花費多大的成本。
輸入格式
輸入的第一行包含四個整數n, m, k, d,分別表示方格圖的大小、棟棟的分店數量、客戶的數量,以及不能經過的點的數量。
接下來m行,每行兩個整數xi, yi,表示棟棟的乙個分店在方格圖中的橫座標和縱座標。
接下來k行,每行三個整數xi, yi, ci,分別表示每個客戶在方格圖中的橫座標、縱座標和訂餐的量。(注意,可能有多個客戶在方格圖中的同乙個位置)
接下來d行,每行兩個整數,分別表示每個不能經過的點的橫座標和縱座標。
輸出格式
輸出乙個整數,表示最優送餐方式下所需要花費的成本。
樣例輸入
10 2 3 3
1 18 8
1 5 1
2 3 3
6 7 2
1 22 2
6 8樣例輸出
評測用例規模與約定
前30%的評測用例滿足:1<=n <=20。
前60%的評測用例滿足:1<=n<=100。
所有評測用例都滿足:1<=n<=1000,1<=m, k, d<=n^2。可能有多個客戶在同乙個格點上。每個客戶的訂餐量不超過1000,每個客戶所需要的餐都能被送到。
一看這道題是個地圖題,想到了dfs和bfs,然後發現是求最優問題,果斷嘗試bfs,但覺得好像**不對勁。其實這道題就是乙個bfs加了點small trick= =。
首先明確一點:不論乙個位置有多少個顧客,這個位置所有顧客的需求總量一定是由「最近」的一家分店承擔的(可以用反證法證明)。然後就是哪家分店「最近」的問題了,「最近」一定是所有分店中最近的,所以考慮從所有分店同時開始bfs,到達乙個顧客點就完成這個點的需求,顯然這是正確的。為了「同時」開始bfs,在開始將所有的分店加入到佇列中去就行了,由於bfs的特性,雖然各分店開始的順序與加入佇列的順序有關,但是每一輪(同一層)的搜尋都是同步的,所以雖然不是嚴格意義上的「同時」,但是這是沒問題的。所以說這道題的乙個小trick就是在開始將多個起點放入佇列。其他的儘管bfs= =。
不過,還有個20分的坑估計很多人會跳進去。注意評測用例規模:「1<=n<=1000,1<=m, k, d<=n^2。可能有多個客戶在同乙個格點上。每個客戶的訂餐量不超過1000,每個客戶所需要的餐都能被送到。」,考慮一種容易考慮的情況(如下圖)
若左下角(1,1)有唯一一家分店,右上角(1000,1000)有1000,000個顧客,每個顧客的訂餐量為1000,無禁止通過的點。那麼,從分店(1,1)走到顧客所在的點(1000,1000)需要2000步左右;然後1000,000個顧客,每人訂餐量1000,總訂餐量10^9,總共花費2000 * 10^9 = 2 * 10^12,顯然這超出了int的範圍,所以要使用long long型別,使用時注意與計算相關的變數也使用long long型別避免在預設型別轉換時發生錯誤。如果程式其他部分編寫沒問題,把這個問題改正就能從80分改到100分了。
#include#includeusing namespace std;
const int max_size = 1000;
struct point_info;
bool legal(int x,int y,int n)
long long customer_need[max_size+1][max_size+1] = ;//記錄乙個點所有顧客的總需求
int customers[max_size+1][max_size+1] = ;//記錄同一點有幾個顧客
int main();
point_info front,t;
const int move[2] = ,,,};
scanf("%d %d %d %d",&n,&m,&k,&d);
while(m--)
for(int i=0;i
while(d--)
while(!q.empty())
for(int i=0;i<4;i++)
} }printf("%lld\n",ans);
return 0;
}
CCF 201409 4 最優配餐
問題描述 棟棟最近開了一家餐飲連鎖店,提供外賣服務。隨著連鎖店越來越多,怎麼合理的給客戶送餐成為了乙個急需解決的問題。棟棟的連鎖店所在的區域可以看成是乙個n n的方格圖 如下圖所示 方格的格點上的位置上可能包含棟棟的分店 綠色標註 或者客戶 藍色標註 有一些格點是不能經過的 紅色標註 方格圖中的線表...
CCF 201409 4 最優配餐
試題編號 201409 4 試題名稱 最優配餐 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 棟棟最近開了一家餐飲連鎖店,提供外賣服務。隨著連鎖店越來越多,怎麼合理的給客戶送餐成為了乙個急需解決的問題。棟棟的連鎖店所在的區域可以看成是乙個n n的方格圖 如下圖所示 方格的格點上...
CCF201409 4 最優配餐 簡單bfs
問題描述 棟棟最近開了一家餐飲連鎖店,提供外賣服務。隨著連鎖店越來越多,怎麼合理的給客戶送餐成為了乙個急需解決的問題。棟棟的連鎖店所在的區域可以看成是乙個n n的方格圖 如下圖所示 方格的格點上的位置上可能包含棟棟的分店 綠色標註 或者客戶 藍色標註 有一些格點是不能經過的 紅色標註 方格圖中的線表...