LOJ #6035.「雅礼集训 2017 Day4」洗衣服 贪心

这道题的贪心好迷啊~
我们对于两个过程进行单独贪心,然后再翻转一个,把这两个拼起来.
先说一下单独贪心,单独贪心的话就是用一个堆,每次取出最小的,并且把这个最小的加上他单次的,再放进去.这样,我们得到的结果,是对于某些洗衣机,不停地洗,然后把这些洗衣机的时间,混在一起,排个序,由于对于每个洗衣机,如果被用到,那么他就会被不停地用,如果我们稍作改动,就一定会是用小的换来大的,所以这样最优.
我们把两个拼起来为什么是对的呢.对于两个单独的答案,最优的无疑是,翻转之后拼起来,因为如果不是这样,也就是说进行了换位,那么参与交换的原来顶着的甲方的A和己方的B,一定会被大于等于A的C和大于等于B的D所代替,那么这个时候答案一定不会变小.那么为什么我们两个单独的最优答案,在拼接的时候,还是能拼出来最优的呢,这是因为,就像我们在上一段说的,我们的到的最优答案,是无条件最优,也就是说,其他的答案,没有一处会比他好.
冷静地去思考、证明贪心确实是一个不二之选.
(随机堆的随机数是1和0轮换的话,好快啊……二叉堆比左偏树快好多啊……)

#include <cstdio>
#include <cstring>
#include <algorithm>
typedef long long LL;
#define read(a) (scanf("%d",&a))
const int L=1000010,N=100010;
struct Heap{
  LL key[N];
  int val[N],n;
  inline void Init(){read(n);}
  inline void build(){
    register int i;
    for(i=1;i<=n;++i)read(val[i]);
    std::sort(val+1,val+(n+1));
    for(i=1;i<=n;++i)key[i]=val[i];
  }
  inline LL top(){return key[1];}
  inline void update(){
    key[1]+=val[1];
    register int index=1,next;
    while(index<=(n>>1)){
      next=index<<1;
      if(next<n&&key[next]>key[next|1])++next;
      if(key[next]>=key[index])return;
      std::swap(key[index],key[next]);
      std::swap(val[index],val[next]);
      index=next;
    }
  }
}Wash,Dry;
LL a[L],b[L];
int l;
inline void Init(){
  read(l);
  Wash.Init(),Dry.Init();
  Wash.build(),Dry.build();
}
inline void work(){
  register int i;
  for(i=1;i<=l;++i){
    a[i]=Wash.top(),Wash.update();
    b[i]=Dry.top(),Dry.update();
  }
}
inline void print(){
  register LL ans=0;
  register int i;
  for(i=1;i<=l;++i)
    ans=std::max(ans,a[i]+b[l-i+1]);
  printf("%lld\n",ans);
}
int main(){
  Init(),work(),print();
  return 0;
}

 

转载于:https://www.cnblogs.com/TSHugh/p/8625121.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值