日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[APIO/CTSC 2007]数据备份(贪心+堆)

發(fā)布時(shí)間:2025/3/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [APIO/CTSC 2007]数据备份(贪心+堆) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

你在一家 IT 公司為大型寫字樓或辦公樓(offices)的計(jì)算機(jī)數(shù)據(jù)做備份。然而數(shù)據(jù)備份的工作是枯燥乏味的,因此你想設(shè)計(jì)一個(gè)系統(tǒng)讓不同的辦公樓彼此之間互相備份,而你則坐在家中盡享計(jì)算機(jī)游戲的樂趣。

已知辦公樓都位于同一條街上。你決定給這些辦公樓配對(duì)(兩個(gè)一組)。每一對(duì)辦公樓可以通過在這兩個(gè)建筑物之間鋪設(shè)網(wǎng)絡(luò)電纜使得它們可以互相備份。

然而,網(wǎng)絡(luò)電纜的費(fèi)用很高。當(dāng)?shù)仉娦殴緝H能為你提供 K 條網(wǎng)絡(luò)電纜,這意味著你僅能為 K 對(duì)辦公樓(或總計(jì) 2K 個(gè)辦公樓)安排備份。任一個(gè)辦公樓都屬于唯一的配對(duì)組(換句話說,這 2K 個(gè)辦公樓一定是相異的)。

此外,電信公司需按網(wǎng)絡(luò)電纜的長(zhǎng)度(公里數(shù))收費(fèi)。因而,你需要選擇這 K對(duì)辦公樓使得電纜的總長(zhǎng)度盡可能短。換句話說,你需要選擇這 K 對(duì)辦公樓,使得每一對(duì)辦公樓之間的距離之和(總距離)盡可能小。

下面給出一個(gè)示例,假定你有 5 個(gè)客戶,其辦公樓都在一條街上,如下圖所示。這 5 個(gè)辦公樓分別位于距離大街起點(diǎn) 1km, 3km, 4km, 6km 和 12km 處。電信公司僅為你提供 K=2 條電纜。

Solution

通過觀察我們發(fā)現(xiàn)最優(yōu)解只可能是兩個(gè)相鄰的點(diǎn)。

問題轉(zhuǎn)化成了給一些點(diǎn),選出其中m個(gè)使他們?cè)诨ゲ幌噜彽那疤嵯聶?quán)值和最小。

這讓我想到了一道題叫種樹,然后發(fā)現(xiàn)一毛一樣2333。

考慮選擇一個(gè)點(diǎn)后,兩邊都不能選了,但最優(yōu)解有可能屬于兩邊。

我們從堆里取出最小的點(diǎn),把兩邊的點(diǎn)刪掉,用兩邊的點(diǎn)權(quán)之和減去當(dāng)前點(diǎn)的權(quán)值最為這個(gè)點(diǎn)的權(quán)值放進(jìn)堆里,繼續(xù)貪心。

為什么這樣是對(duì)的,因?yàn)楫?dāng)我貪心的選擇了一個(gè)點(diǎn)后,兩邊的點(diǎn)要么都選,要么都不選,如果只選一個(gè),還不如只選中間點(diǎn)呢。

注意因?yàn)橐∽钚≈?#xff0c;所以注意判一下邊界。

Code

#include<iostream> #include<cstdio> #include<queue> #define mm make_pair #define N 100002 using namespace std; priority_queue<pair<long long,int> >q; int n,k,l[N],r[N]; long long ans,a[N]; bool ji[N]; int main(){scanf("%d%d",&n,&k);for(int i=1;i<=n;++i)scanf("%d",&a[i]);n--;for(int i=1;i<=n;++i){a[i]=a[i+1]-a[i],q.push(mm(-a[i],i));l[i]=i-1;r[i]=i+1;}a[0]=a[n+1]=0x7f7f7f7f; for(int i=1;i<=k;++i){ int x=q.top().second,y=q.top().first;q.pop();while(ji[x]){x=q.top().second;y=q.top().first;q.pop();}ans-=y;a[x]=a[l[x]]+a[r[x]]-a[x];q.push(mm(-a[x],x));ji[l[x]]=ji[r[x]]=1;l[x]=l[l[x]];r[l[x]]=x;r[x]=r[r[x]];l[r[x]]=x;}cout<<ans; }

?

轉(zhuǎn)載于:https://www.cnblogs.com/ZH-comld/p/9590804.html

總結(jié)

以上是生活随笔為你收集整理的[APIO/CTSC 2007]数据备份(贪心+堆)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。