Codeforces 958E2 Guard Duty (medium) 反悔贪心

文章目录


一道经典反悔贪心模板题,但是 k k k只有 5000 5000 5000,所以题解变成了 k 2 k^2 k2的优化 d p dp dp.

题意

你的宇宙飞船要会见 k k k位领导人,只有一些固定时间能让领导人上下车,但是值得高兴的是领导人只会待一会.你不能同时会见两个以上的领导人,同一个时间只能让一个领导人上车或者下车.问会见这些领导人至少要多少时间.

题解

转化模型.对时间排序后计算相邻差,则问题转化为取 k k k个数使得没有两个相邻,此为经典反悔贪心模板.
首先构建双向链表,取走最大的数的时候,由于可能存在两边之和大于它本身的情况,我们删去两边的结果,将 a i + 1 + a i − 1 − a i a_{i+1}+a_{i-1}-a_i ai+1+ai1ai赋值给 a i a_i ai,这样如果再取最大值,取到 a i a_i ai的时候,答案就相当于取了两边的数字.
这样的贪心进行 k k k次便可得到最优解.
谢谢大家.

const int yuzu=5e5;
const ll inf=1e18;
typedef ll fuko[yuzu|10];
typedef pair<ll,int> pli;
fuko net,pre,a;
int main() {
  int n,k,i;
  read(k),read(n);
  for (i=1;i<=n;++i) read(a[i]);
  sort(a+1,a+n+1);
  for (i=1;i<n;++i) {
    a[i]=a[i+1]-a[i];
    net[i]=i+1,pre[i]=i-1;
  } 
  net[n-1]=0;
  ll zw=0;
  priority_queue<pli,vector<pli>,greater<pli>> q;
  for (i=1;i<n;++i) q.push(pli(a[i],i));
  for (;k--;) {
    for (;q.top().first^a[q.top().second];) q.pop();
    int u=q.top().second,l=pre[u],r=net[u];
    zw+=a[u]; q.pop();
    pre[net[u]=net[r]]=u;
    net[pre[u]=pre[l]]=u;
    a[u]=l&&r?min(inf,a[l]+a[r]-a[u]):inf;
    a[l]=a[r]=inf;
    q.push(pli(a[u],u));
  }
  printf("%lld\n",zw);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值