BZOJ 1150 (堆 鍊錶)

2021-09-30 16:46:35 字數 1553 閱讀 3634

你在一家 it 公司為大型寫字樓或辦公樓(offices)的計算機資料做備份。然而資料備份的工作是枯燥乏味

的,因此你想設計乙個系統讓不同的辦公樓彼此之間互相備份,而你則坐在家中盡享計算機遊戲的樂趣。已知辦公

樓都位於同一條街上。你決定給這些辦公樓配對(兩個一組)。每一對辦公樓可以通過在這兩個建築物之間鋪設網

絡電纜使得它們可以互相備份。然而,網路電纜的費用很高。當地電信公司僅能為你提供 k 條網路電纜,這意味

著你僅能為 k 對辦公樓(或總計2k個辦公樓)安排備份。任乙個辦公樓都屬於唯一的配對組(換句話說,這 2k 

個辦公樓一定是相異的)。此外,電信公司需按網路電纜的長度(公里數)收費。因而,你需要選擇這 k 對辦公

樓使得電纜的總長度盡可能短。換句話說,你需要選擇這 k 對辦公樓,使得每一對辦公樓之間的距離之和(總距

離)盡可能小。下面給出乙個示例,假定你有 5 個客戶,其辦公樓都在一條街上,如下圖所示。這 5 個辦公樓分

別位於距離大街起點 1km, 3km, 4km, 6km 和 12km 處。電信公司僅為你提供 k=2 條電纜。

上例中最好的配對方案是將第 1 個和第 2 個辦公樓相連,第 3 個和第 4 個辦公樓相連。這樣可按要求使用

k=2 條電纜。第 1 條電纜的長度是 3km-1km=2km ,第 2 條電纜的長度是 6km-4km=2km。這種配對方案需要總長

4km 的網路電纜,滿足距離之和最小的要求。

分析:最優解中,每兩個配對的辦公樓一定是相鄰的。每兩個辦公樓之間的距離,記為:d1,d2,d3,d4,,,,d n-1。於是問題轉化為:從數列d中選出不超過k個數(對應辦公樓的k個配對),使他們的和最小,並且相鄰的兩個數不能同時被選(任一辦公樓都屬於唯一的配對組)。

然後策略是這樣的:

k=1 顯然最小邊。

k>=2

選擇最小值 di,以及除了它旁邊兩個數之外,其他數的最小值。

或者 選最小值旁邊的兩個數。

所以可以得到推論:最優解中,最小值左右兩側的數要麼同時選,要麼都不選。因此我們可以先選擇最小值,然後把di-1 、di 、di+1 從數列中刪除,把di-1 + d i+1 - di 插入到剛才刪除di的位置上。如果後來選了這個加上的數,相當於沒有選di,而是選的它旁邊的兩個數。

所以用鍊錶和最小堆可以實現這個思想:

const int maxn = 1e6+11;

int f[maxn],a[maxn],pre[maxn],nxt[maxn],v[maxn];

int n,m,p;

int x,ans;

void up(int p)

else break;

}}void down(int l,int r)

else break;

}}void ins(int x)

void erase(int x)

int main()

rep(i,1,m+1)

else if(nxt[x] == n)

else

}cout << ans << endl;

return 0;

}

BZOJ1150 資料備份 堆 鍊錶

選出的 k kk 組一定相鄰,所以我們預處理出相鄰兩個辦公樓的間距,共 n 1 n 1 n 1 個。問題轉化為挑出 k kk 個元素,使其和盡量小且互不相鄰。假設我們選擇了其中最小的,就不能選其兩邊的 假如我們沒有選擇最小的,就一定會選擇其兩邊的,否則,將選擇的某個換成最小的會更優。建乙個鍊錶和乙個...

BZOJ 1150 資料備份

1150 ctsc2007 資料備份backup time limit 10 sec memory limit 162 mb submit 1480 solved 592 submit status discuss description 你在一家 it 公司為大型寫字樓或辦公樓 offices 的...

資料備份BZOJ1150

題幹在這 bzoj1150 我們注意到選取的一定是相鄰的邊,那我們先求出兩兩之間相隔的距離d i 可知如果我們選了d i 那麼我們就不能選d i 1 和d i 1 我們每次找到乙個最小的值d i 並把d i d i 1 和d i 1 刪去 我們又要保留選d i 1 和d i 1 的可能性,所以再在原...