BZOJ1150 CTSC2007 資料備份

2022-05-12 14:52:35 字數 1141 閱讀 7612

**堆:

題目傳送門:

顯然,這題用貪心轉化一下題意就是給你\(n-1\)個數,選\(k\)個不相鄰的數權值和最小。

假設最小值是\(a_x\),那麼選完\(a_x\)之後\(a_\)和\(a_\)就不能選了。

如果\(a_\)和\(a_\)只選了某乙個,顯然把這個換成\(a_x\)更優。

所以最優解要麼有\(a_x\)沒有\(a_\)和\(a_\),要麼同時有\(a_\)和\(a_\)。

所以我們每次從堆裡取出來乙個數之後,再把它前乙個數和後乙個數在堆裡刪掉,往堆裡塞乙個\(a_+a_-a_i\)即可。這樣就可以考慮這兩種情況了。

如果取出的這個數前面沒有數或者後面沒有數,那麼就不需要加\(a_+a-a_i\)進堆,而是把它後乙個數或者前乙個數也從堆裡刪掉。可以證明,如果選了當前這個數,那麼與它相鄰的那個數必然不會被選。因為選與它相鄰的數之後所遇到的局面,選當前數也能到達,這個決策包涵了選相鄰的數的決策,而且選當前數更優,所以與當前數相鄰的那個數可以直接捨棄了。

時間複雜度:\(o((n+k)logn)\)

空間複雜度:\(o(n)\)

**如下:

#include #include using namespace std;

const int maxn=1e5+5;

int n,m,ans;

int a[maxn];

int read()

struct linked_list

linked_list(int _lst,int _nxt,int _val)

}l[maxn];

struct heap

else break;

} }void down(int pos)

} while(m--)

if(nxt==n)

t.del(l[lst].in_heap),t.del(l[nxt].in_heap);

l[lst].val=l[lst].val+l[nxt].val-l[id].val;t.ins(lst);

l[lst].nxt=l[nxt].nxt,l[l[nxt].nxt].lst=lst;

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

return 0;

}

BZOJ1150 CTSC2007 資料備份

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

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