ACWing 147.資料備份
題意:
選取K對大樓,使得每對距離之和最小,並且一個大樓只會被連結一次
思路:
當k=1時肯定就是貪心的選取距離最小的那兩棟。
當k=2時我們是否還要留著距離最小的那一對呢?如果沒有選擇距離最小的那一對,那肯定要選擇最小那一對的左右兩對,否則就可以將其中一對換成最小的那對,那樣會更小。
當k>2時同理如果不選擇中間的就必須選擇其左右兩邊的,這樣才能保證較小的那對我是因為實在拿不了的才放棄的,否則就可以更優。
我們可以用一個雙指標連結串列加一個set來完成這些工作,當刪去中間這對時將其左右兩對的權值重新加入set模擬最優策略的過程;
AC程式碼:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
typedef pair<ll,int> PLI;
set<PLI> s;
int l[maxn],r[maxn];
ll d[maxn];
int n,k;
void delete_node(int p) {
r[l[p]] = r[p];
l[r[p]] = l[p];
}
int main()
{
cin>>n>>k;
for(int i=0;i<n;i++) {
cin>>d[i];
}
for(int i=n-1;~i;i--) {
d[i] -= d[i-1];
}
d[0] = d[n] = 1e15;
for(int i=0;i<n;i++) {
l[i] = i-1;
r[i] = i+1;
if(i>=1&&i<n) s.insert({d[i],i});
}
ll res = 0;
while(k--) {
auto it = s.begin();
ll v = it->first;
int p = it->second;
int left = l[p],right = r[p];
s.erase(it);
s.erase({d[left],left});s.erase({d[right],right});
delete_node(left),delete_node(right);
res+=v;
d[p] = d[left]+d[right]-d[p];
s.insert({d[p],p});
}
cout<<res<<endl;
}
相關文章
- 資料備份≠容災備份
- 初探MySQL資料備份及備份原理MySql
- mongo資料備份Go
- 資料備份策略
- oracle資料備份Oracle
- MySQL資料備份MySql
- 資料庫備份資料庫
- 資料同步和資料備份
- oracle資料庫備份之exp增量備份Oracle資料庫
- 備份onetab資料
- mysql 資料庫 備份MySql資料庫
- Mysql資料安全備份MySql
- 資料庫備份策略資料庫
- MongoDB資料庫備份MongoDB資料庫
- mysql 資料庫備份MySql資料庫
- 資料庫備份方案資料庫
- 【備份恢復】從備份恢復資料庫資料庫
- 【RMAN】使用增量備份更新資料庫備份映象資料庫
- Oracle學習系列—資料庫備份—熱備份Oracle資料庫
- Oracle資料庫的備份方法-冷備份(轉)Oracle資料庫
- Dedecms備份的資料檔案位置及備份資料庫的方法資料庫
- Oracle資料庫冷備份與熱備份操作梳理Oracle資料庫
- 【原】Oracle學習系列—資料庫備份—RMAN備份Oracle資料庫
- 帝國cms備份的資料庫資料夾-帝國CMS備份中心資料庫
- 全網資料備份方案
- 七牛網資料備份
- mysqlpump 資料庫備份程式MySql資料庫
- mysqldump 資料庫備份程式MySql資料庫
- 資料庫備份指令碼資料庫指令碼
- TDSQL資料同步和備份SQL
- 使用RMAN備份資料庫資料庫
- innobackupex 備份MySQL資料庫MySql資料庫
- 資料備份與複製
- 資料庫自動備份資料庫
- SQLserver備份資料庫示例SQLServer資料庫
- mysql 備份資料庫 mysqldumpMySql資料庫
- 備份SQL Server資料庫SQLServer資料庫
- master資料庫備份原因AST資料庫