TopCoder

User's AC Ratio

100.0% (1/1)

Submission's AC Ratio

100.0% (2/2)

Tags

Description

Sprouty Mart 是芽芽國市佔率最高的便利商店,如同台灣的 7-11 或全家,我們隨處都可以見到 Sprouty Mart 的影子。也因為經營規模的龐大,如何最佳化補貨的方式和流程就成了一個相當關鍵的問題。假設你今天是 Sprouty Mart 的作業長 (Chief Operations Officer, COO),要解決某一個地區的補貨問題。

在這一個地區,有 $ m $ 個便利商店,其中便利商店 $ i $ 位於 $ (x_i,y_i) $(單位為公里)。為了簡化起見,我們假設所有便利商店都銷售同一種商品。另外,你有 $ n $ 個物流中心,其中物流中心 $ j $ 位在 $ (u_j,v_j) $ 上(單位為公里)。定義物流中心 $ j $ 到便利商店 $ i $ 的距離為
$$ d_{ij} = \left | u_j - x_i\right | + \left | v_j - y_i\right | $$ 公里。

每個便利商店的商品售價都一樣是 $p$,但他們的需求不一樣。我們將便利商店 $ i $ 的需求量稱為 $ D_i $,表示在這家店每天最多能賣掉 $ D_i $ 個商品。要賣東西有個前提,就是前一天晚上要補貨。對於任意一家便利商店,你必須決定由哪個(或哪幾個)物流中心來補貨給它;如果你指定了複數個物流中心給它,還必須指定個別的補貨數量。補貨成本和補貨數量與補貨距離的乘積成正比,每個商品每公里的補貨成本為 $ c $ 元。更精確的說,若物流中心 $ j $ 每晚送 $ k_{ij} $ 個商品到便利商店 $ i $,則其補貨成本為 $$ c_{ij} = cd_{ij}k_{ij} $$
對於這些商品,在便利商店 $ i $ 的銷貨毛利為 $ (p-cd_{ij})k_{ij} $ 元。當然,如果一家店只能賣 100 個商品,而你補 1000 個給它,最後也只能賣出 100 個,剩下 900 個都是浪費錢而已。

給定上述資訊,你的任務是能找出最大化總銷貨毛利的補貨方式;更精確地說,你必須決定上述的 $ k_{ij} $,來求解

$$ max \sum_{i=1} ^ {n} \sum_{j=1} ^ {n} (p-cd_{ij})k_{ij} \; s.t. \sum_{j=1} ^ {n} k_{ij} \leq D_i\; \forall i = 1,...,m \; k_{ij} \geq 0 \;\;\forall i = 1,...,m ,\; j = 1,...,n $$

(上面的數學式若看不懂也沒關係,它單純只是把前面的文字敘述用嚴謹的數學式表達而已)

請注意兩件事情。首先,如果有一家店的補貨成本恰好等於商品售價,那麼請你對它進行補貨以滿足其所有需求。其次,請注意你不一定要滿足所有需求。舉例來說,要是有些店被蓋在非常偏遠的地方,導致補貨成本大於售價,那最好的作法就是不要補貨(這家店就去賣其他東西就好)。換句話說,在很詭異的情況下,搞不好最佳方案是不要補貨給任何一家店。

由於本週的主題之一為 struct,你或許可以想想是不是可以把物流中心與便利商店分別用 struct 包起來,維護它們各自的屬性。因為沒有人會檢查你的程式碼,真的不用 struct 也無所謂,但我們仍然強烈建議你使用 struct 實作,不僅可以練習,更可以讓程式的可讀性和模組化程度提高。

Input Format

系統會提供數筆測試資料,每筆測試資料裝在一個檔案裡。

在每個檔案中,第一列存放四個整數 $n, m, p, c$。

第二列存放 $2n$ 個整數 $u_1, v_1, u_2, v_2, ..., u_n, v_n$,表示第 $i$ 個物流中心在 $(u_i,v_i)$ 上。
第三列存放 $2m$ 個整數 $x_1, y_1, x_2, y_2, ..., x_n, y_n$,表示第 $i$ 個便利商店在 $(x_i,y_i)$ 上。
第四列存放 $m$ 個整數 $D_1, D_2$ 直到 $D_m$,表示第 $i$ 個便利商店的需求量是 $D_i$。

每一列中的任兩個數字之間都用一個空白鍵隔開。

已知

  • $1 \leq n \leq 10$
  • $1 \leq m \leq 1000$
  • $1 \leq p \leq 500$
  • $1 \leq c \leq 10$
  • $0 \leq x_i \leq 200$
  • $0 \leq u_i \leq 200$
  • $0 \leq v_i \leq 200$
  • $1 \leq D_i \leq 100$

且一個位置上不會出現兩個以上的設施(物流中心或便利商店)。

Output Format

請根據題目的描述,找出能最大化總銷貨毛利的補貨計畫,並且印出兩個整數,分別代表在最佳補貨計畫下能賺到的總銷貨毛利以及未被滿足的需求總量,中間用一個逗點隔開,輸出後請記得換行。

Sample Input 1

2 6 5 1
2 2 4 5
1 1 1 2 2 5 3 1 7 1 8 4
3 4 5 6 7 8

Sample Output 1

58,7

Sample Input 2

2 6 5 10
2 2 4 5
1 1 1 2 2 5 3 1 7 1 8 4
3 4 5 6 7 8

Sample Output 2

0,33

Hints

Problem Source

NEOJ Problem 991

Subtasks

No. Testdata Range Constraints Score
1 0~19 100

Testdata and Limits

No. Time Limit (ms) Memory Limit (VSS, KiB) Output Limit (KiB) Subtasks
0 2000 655360 65536 1
1 2000 655360 65536 1
2 2000 655360 65536 1
3 2000 655360 65536 1
4 2000 655360 65536 1
5 2000 655360 65536 1
6 2000 655360 65536 1
7 2000 655360 65536 1
8 2000 655360 65536 1
9 2000 655360 65536 1
10 2000 655360 65536 1
11 2000 655360 65536 1
12 2000 655360 65536 1
13 2000 655360 65536 1
14 2000 655360 65536 1
15 2000 655360 65536 1
16 2000 655360 65536 1
17 2000 655360 65536 1
18 2000 655360 65536 1
19 2000 655360 65536 1