BZOJ 1150 資料備份

2022-05-11 05:19:11 字數 1374 閱讀 3814

你在一家 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 的網路電纜,滿足距離之和最小的要求。

第一行包含整數n和k

其中n(2≤n≤100000)表示辦公樓的數目,k(1≤k≤n/2)表示可利用的網路電纜的數目。

接下來的n行每行僅包含乙個整數(0≤s≤1000000000),表示每個辦公樓到大街起點處的距離。

這些整數將按照從小到大的順序依次出現。

輸出應由乙個正整數組成,給出將2k個相異的辦公樓連成k對所需的網路電纜的最小總長度。

5 2題意:給一組長度為n有序資料,k個不相鄰資料的最小和。

分析:因為如果不選擇di而只選旁邊兩個中的乙個,那麼這種情況絕對不是最優解因為可以選更小的di。

所以如果選中了di,要把di-1和di+1都刪除,並且儲存值di-1+di+1-di到鍊錶當中,這樣做其實是一種後悔策略,如果我們後面選這個值更小時,相當於上述說的第二種情況

const int n = 550000;

const long long inf = 1e18;

typedef pairpa;

int k, n, nxt[n], pre[n];

long long t[n];

priority_queueq;

int main()

printf("%lld\n", ans);

return 0;

}

一些小習慣

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 的可能性,所以再在原...

BZOJ 1150 資料備份Backup

算是套路的貪心,因為給出資料是有序的,先將相鄰的搞成線段存進堆裡,每次取出乙個最小的值,加到總值中,並改變左右的鍊錶值,並將左右線段值存入當前位置作為撤銷操作。include include include define mk a,b make pair a,b using namespace st...