選出的 k
kk 組一定相鄰,所以我們預處理出相鄰兩個辦公樓的間距,共 n−1
n - 1
n−1 個。
問題轉化為挑出 k
kk 個元素,使其和盡量小且互不相鄰。
假設我們選擇了其中最小的,就不能選其兩邊的;假如我們沒有選擇最小的,就一定會選擇其兩邊的,否則,將選擇的某個換成最小的會更優。
建乙個鍊錶和乙個堆,滿足其中元素對應,且對應元素之間可互達,每次挑出最小值,刪除最小值及其兩端元素。
然後加入乙個新元素,其值為兩邊元素和減最小值,用來表示不選最小值而選兩邊元素的情況。
問題規模縮小,以此類推即可得出最終答案。
加入最小值在邊界上,顯然直接刪除其與其相鄰元素即可,即此時最小值必選。
#include
#include
using
namespace std;
inline
intread()
const
int maxn =
1e5+5;
struct node1 l[maxn]
;inline
void
del(
int p)
struct node2
bool
operator
<
(const node2& rhs)};
struct heap
voidup(
int p)
else
break;}
}void
down
(int p)
else
break;}
}void
insert
(node2 x)
void
remove
(int p =1)
} h;
intmain()
for(
int i =
1; i <= k;
++i)
else
if(l[p]
.r == n)
else
}printf
("%d"
, ans)
;return0;
}
BZOJ 1150 (堆 鍊錶)
你在一家 it 公司為大型寫字樓或辦公樓 offices 的計算機資料做備份。然而資料備份的工作是枯燥乏味 的,因此你想設計乙個系統讓不同的辦公樓彼此之間互相備份,而你則坐在家中盡享計算機遊戲的樂趣。已知辦公 樓都位於同一條街上。你決定給這些辦公樓配對 兩個一組 每一對辦公樓可以通過在這兩個建築物之...
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 的可能性,所以再在原...