BZOJ1150 CTSC2007 資料備份

2022-05-20 11:52:09 字數 2122 閱讀 3012

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

當地電信公司僅能為你提供\(k\) 條網路電纜,這意味著你僅能為 \(k\)對辦公樓(或總計\(2k\)個辦公樓)安排備份。任乙個辦公樓都屬於唯一的配對組(換句話說,這 \(2k\)個辦公樓一定是相異的)。此外,電信公司需按網路電纜的長度(公里數)收費。

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

下面給出乙個示例,假定你有 \(5\) 個客戶,其辦公樓都在一條街上。這 \(5\) 個辦公樓分別位於距離大街起點 \(1km, 3km, 4km, 6km\) 和 \(12km\) 處。電信公司僅為你提供 \(k=2\) 條電纜。

上例中最好的配對方案是將第 \(1\) 個和第$ 2$ 個辦公樓相連,第 \(3\) 個和第 \(4\) 個辦公樓相連。這樣可按要求使用\(k=2\) 條電纜。第 \(1\) 條電纜的長度是 \(3\)km-\(1\)km=\(2\)km ,第$ 2$ 條電纜的長度是$ 6$km-\(4\)km=\(2\)km。這種配對方案需要總長\(4\)km 的網路電纜,滿足距離之和最小的要求。

輸入的第一行包含整數\(n\)和\(k\),其中\(n(2 \le n \le 100000)\)表示辦公樓的數目,\(k\)表示可利用的網路電纜的數目。

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

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

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

5 2 13

4612

4
看到題面,很顯然可以得到每棟寫字樓必定要

和其相鄰的寫字樓相連線。

很自然的用堆來維護。

可是否是每次將堆頂的未取線段取走,並打標記呢?

由樣例就可以看出,這是不行的。。

那麼該怎麼辦呢?

於是我們要給程式乙個「後悔「的機會:將彈出的兩側辦公樓對合為一對,其距離為兩個辦公樓對的距離和-彈出的辦公樓距離。

這樣我們取這個對的時候就相當於減去了中間的對而取了旁邊兩側的對,就是乙個「後悔」的過程啦!

維護兩側的對可以用鍊錶來實現。

注意一定要清空有關變數;

#includeusing namespace std;

#define reg register

#define rep(a,b,c) for(reg int a=(b),a##_end_=(c); a<=a##_end_; ++a)

#define drep(a,b,c) for(reg int a=(b),a##_end_=(c); a>=a##_end_; --a)

#define debug(x) cerr<<#x<<" = "<=48);

return res*f;

}void min(double &a,double b)

const int m=1e5+5;

int n,k,ans,a[m],s[m],l[m],r[m];

bool vis[m];

void add(int num)

void del(int num)

struct node

};priority_queueq;

int main()

s[0]=s[n]=1e9;

rep(i,1,k)

ans+=s[now.id];

s[now.id]=s[l[now.id]]+s[r[now.id]]-s[now.id];

del(l[now.id]),del(r[now.id]);

q.push((node)<%now.id%>);

}printf("%d",ans);

}

BZOJ1150 CTSC2007 資料備份

堆 題目傳送門 顯然,這題用貪心轉化一下題意就是給你 n 1 個數,選 k 個不相鄰的數權值和最小。假設最小值是 a x 那麼選完 a x 之後 a 和 a 就不能選了。如果 a 和 a 只選了某乙個,顯然把這個換成 a x 更優。所以最優解要麼有 a x 沒有 a 和 a 要麼同時有 a 和 a ...

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