嘟嘟嘟
這竟然是一道貪心題,然而我在不看題解之前一直以為是dp。
首先最優的配對一定是相鄰兩個建築物配對,所以我們求出差分陣列,就變成了在n - 1個數中選出不相鄰的k個數,使這k個數的和最小。
貪心是在回事呢?首先把所有點放在乙個小根堆中,然後如果取出乙個點ai,就把ai-1 + ai+1 - ai放到小根堆中,這樣如果以後選了ai-1 + ai+1 - ai這個數,就把前面選的ai抵消了,所以這兩次操作就相當於選了ai-1和ai+1這兩個數。
每選一次就合併了兩個數,那麼進行k次就選了k個數,所以迴圈k次後,累加的答案就是最優解。
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include10 #include11view codeusing
namespace
std;
12#define enter puts("")
13#define space putchar(' ')
14#define mem(a, x) memset(a, x, sizeof(a))
15#define rg register
16 typedef long
long
ll;17 typedef double
db;18
const
int inf =1e9;
19const db eps = 1e-8;20
const
int maxn = 1e5 + 5;21
inline ll read()
2226
while(isdigit(ch))
27if(last == '
-') ans = -ans;
28return
ans;29}
30 inline void
write(ll x)
3136
37int
n, k, a[maxn];
38int
dif[maxn], pre[maxn], nxt[maxn];
39 ll ans = 0;40
41#define pr pair42
#define mp make_pair
43#define fir first
44#define sec second
45 priority_queue, greater>q;
4647
intmain()
4857 nxt[n - 1] = 0;58
for(int i = 1; i <= k; ++i)
59 //
合併後就跳過
62 ans +=now.fir;
63int ls = pre[now.sec], rs =nxt[now.sec];
64 nxt[now.sec] = nxt[rs]; pre[nxt[now.sec]] =now.sec;
65 pre[now.sec] = pre[ls]; nxt[pre[now.sec]] =now.sec;
66 dif[now.sec] = (ls && rs) ? dif[ls] + dif[rs] -dif[now.sec] : inf;
67 dif[ls] = dif[rs] =inf;
68q.push(mp(dif[now.sec], now.sec));69}
70write(ans), enter;
71return0;
72 }
APIO CTSC 2007 資料備份
真正的貪心好題 一段區間被取後,旁邊兩端區間不能再取,但我們可以捨棄掉這一段,去取旁邊的兩段 這樣的貪心策略怎麼維護呢?我們用堆維護貪心,每次選擇這段區間後,將兩邊的區間合併成一段,權值是 w w w i 也就是捨棄中間這一段,取兩邊的 但是這樣的做法只能做一次捨棄,事實上我們可能會有多次,然而我們...
mysql 冷備 Mysql資料冷備操作方法
定期的備份可使我們資料庫崩潰造成的損失大大降低。在mysql中進行資料備份的方法有兩種,一種是使用mysqldump程式,第二種是使用mysqlhotcopy cp tar或cpio等打包程式直接拷貝資料庫檔案。mysqldump程式備份資料庫較慢,但它生成的文字檔案便於移植。使用mysqlhotc...
資料備分 硬碟篇
硬碟儲存資料是根據電 磁轉換原理實現的。硬碟由乙個或幾個表面鍍有磁性物質的金屬或玻璃等物質碟片以及碟片兩面所安裝的磁頭和相應的控制電路組成 圖1 其中碟片和磁頭密封在無塵的金屬殼中。硬碟工作時,碟片以設計轉速高速旋轉,設定在碟片表面的磁頭則在電路控制下徑向移動到指定位置然後將資料儲存或讀取出來。當系...