BZOJ 1150 資料備份

2021-07-14 13:57:00 字數 2391 閱讀 5005

1150: [ctsc2007]資料備份backup

time limit: 10 sec memory limit: 162 mb

submit: 1480 solved: 592

[submit][status][discuss]

description

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

input

輸入的第一行包含整數n和k,其中n(2 ≤ n ≤100 000)表示辦公樓的數目,k(1≤ k≤ n/2)表示可利用

的網路電纜的數目。接下來的n行每行僅包含乙個整數(0≤ s ≤1000 000 000), 表示每個辦公樓到大街起點處

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

output

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

sample input

5 2

1 3

4 6

12 sample output

4【分析】

這道題比較6

翻譯一下題目:數軸上有n個點,選出其中的k對點,每個點只能選一次,使得每對點的距離總和最小。

首先對資料差分。求出線段的屬性:左邊線段下標,右邊線段下標,和該線段長度。並將它們push進乙個小根堆!左線段與右線段下標用兩個陣列pre和next來儲存,線段原下標和長度一起push進堆裡。

下面就非常精妙了

加入乙個線段後,它兩邊的線段就不能再加進去了。但是這樣裸著貪心答案是錯的。舉個反例: 100 2 1 2 100 選出兩對點,如果直接貪心選的是1和100,但顯然2和2更優。那麼我們將1push進去之後,將2 1 2合併(改動該線段的左右線段下標等等,具體見**),ans+=1。然後再push乙個長度:2+2-1。

如果在之後的貪心中,2+2-1更優,那麼我們就選出2+2-1,並將ans+=2+2-1

這樣的話就相當於選了左右兩個線段,而不選兩個線段中間的線段。

操作:合併之後把線段x的左線段l,右線段r的長度修改為inf。在大迴圈中如果發現該線段當前長度與初長度不符,則直接彈出。

具體會用到make_pair等亂七八糟的東西,用於把兩個屬性同步放入堆中。

(感謝學姐的6到**的部落格)

【**】

//bzoj 1150 資料備份 

#include

#include

#include

#include

#include

#define inf 1000000001

#define mp make_pair

#define pa pair

#define fo(i,j,k) for(i=j;i<=k;i++)

using

namespace

std;

priority_queue vector

,greater> q;

const

int t=100002;

int len[t],pre[t],next[t];

int b[t],a[t],n,m,ans;

int main()

pre[2]=0,next[n]=0; //處理邊界

fo(i,1,m)

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

return

0;}

資料備份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 資料備份

你在一家 it 公司為大型寫字樓或辦公樓 offices 的計算機資料做備份。然而資料備份的工作是枯燥乏味 的,因此你想設計乙個系統讓不同的辦公樓彼此之間互相備份,而你則坐在家中盡享計算機遊戲的樂趣。已知辦公 樓都位於同一條街上。你決定給這些辦公樓配對 兩個一組 每一對辦公樓可以通過在這兩個建築物之...

BZOJ 1150 資料備份Backup

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