HAOI2010 工廠選址題解

2022-05-21 18:12:16 字數 1614 閱讀 7355

某地區有m座煤礦,其中第i號礦每年產量為ai噸,現有火力發電廠乙個,每年需用煤b噸,每年執行的固定費用(包括折舊費,不包括煤的運費)為h元,每噸原煤從第i號礦運到原有發電廠的運費為ci0(i=1,2,…,m)。

現規劃新建乙個發電廠,m座煤礦每年開採的原煤將全部供給這兩座發電廠。現有n個備選的廠址。若在第j號備選廠址建新廠,每年執行的固定費用為hj元。每噸原煤從第i號礦運到j號備選廠址的運費為cij(i=1,2,…,m;j=1,2,…,n)。

試問:應把新廠廠址選取在何處?m座煤礦開採的原煤應如何分配給兩個發電廠,才能使每年的總費用(發電廠執行費用與原煤運費之和)為最小。

輸入格式:

第1行: m b h n

第2行: a1 a2 … am (0<=ai<=500, a1+a2+...+an>=b)

第3行: h1 h2 … hn (0<=hi<=100)

第4行: c10 c20 … cm0 (0<=cij<=50)

第5行: c11 c21 … cm1

第n+4行:c1n c2n … cmn

輸出格式:

第1行:新廠址編號,如果有多個編號滿足要求,輸出最小的。

第2行:總費用

對於所有資料, n<=50, m<=50000, b<=10000

我們看到這道題的資料,發現工廠的數量不會多餘50個,所以我們可以考慮列舉新的工廠的選址。

然後,問題就轉化為了兩個工廠如何分配資源使得總花費最小,我們可以利用貪心的思想來做:

如果所有的資源都匯集到新建的廠(now),那麼花費就為∑(a[i]*c[i][now]),然後我們要從所有的資源中提取出b的資源使得這個值最小,所以我們可以記錄w[i] = c[i][now] - c[i][0]表示把i的資源移到原工廠每噸會多花多少錢。然後我們在以此排序貪心即可。

這種貪心的思想是利用的一種差值,這個差值的實際含義為:在把所有的關鍵量都放在乙個組中達到乙個定值,然後在從中移取出一部分,而達到的新的量就是新的花費減去不用的花費在這種情況下我們就可以使用差值來貪心。

#includeusing

namespace

std;

intb, m, n, h;

int c[50005][55], cost[55], a[50005

];struct

factw[50005];

inline bool comp(const fact & x, const fact & y)

intmain()

sort(w + 1, w + 1 +m, comp);

int k = 0

;for

(;;)

tag +=a[w[k].pos];

ans += c[w[k].pos][0] *a[w[k].pos];

}for(;k <= m;) ++ k, ans += c[w[k].pos][i] *a[w[k].pos];

ans += h +cost[i];

if(sumcost >ans)

} printf("

%d\n%d\n

", num, sumcost);

return0;

}

bzoj 2426 HAOI2010 工廠選址

某地區有m座煤礦,其中第i號礦每年產量為ai噸,現有火力發電廠乙個,每年需用煤b噸,每年執行的固定費用 包括折舊費,不包括煤的運費 為h元,每噸原煤從第i號礦運到原有發電廠的運費為ci0 i 1,2,m 現規劃新建乙個發電廠,m座煤礦每年開採的原煤將全部供給這兩座發電廠。現有n個備選的廠址。若在第j...

HAOI2010 軟體安裝

現在我們的手頭有n個軟體,對於乙個軟體i,它要占用wi的磁碟空間,它的價值為vi。我們希望從中選擇一些軟體安裝到一台磁碟容量為m計算機上,使得這些軟體的價值盡可能大 即vi的和最大 但是現在有個問題 軟體之間存在依賴關係,即軟體i只有在安裝了軟體j 包括軟體j的直接或間接依賴 的情況下才能正確工作 ...

HAOI2010 軟體安裝

現在我們的手頭有n個軟體,對於乙個軟體i,它要占用wi的磁碟空間,它的價值為vi。我們希望從中選擇一些軟體安裝到一台磁碟容量為m計算機上,使得這些軟體的價值盡可能大 即vi的和最大 但是現在有個問題 軟體之間存在依賴關係,即軟體i只有在安裝了軟體j 包括軟體j的直接或間接依賴 的情況下才能正確工作 ...