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...