HDU 5014

本文详细解析HDU5014题目,通过贪心算法解决序列配对问题,实现最大化操作。讨论了算法的正确性,并提供了代码实现。适用于对贪心算法和序列操作感兴趣的读者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HDU 5014

传送门

题意:给你一个0~n的序列,求另一个0~n的序列,使得这里写图片描述的值最大。(这里的“+”是指a[i]^b[i])

分析

要使值最大,如4的二进制是100,则要使其变为111,这样4就要与3异或,那么3自然要与4异或,往后多写几个数就会发现,它们会两两配对。所以,就用贪心从大往小遍历一次,即可得到答案。(注意:奇数和偶数的配对方式不一样,当n位奇数时,有偶数个数,可以两两配对,但n为偶数时,有奇数个数,那么就使0与自己配对即可)

算法的正确性

因为保证了单元的a[i]^b[i]最大,所以所得的和必然最大
代码如下:

#include<stdio.h>
#include<string.h>
#define ll long long
int a[100005],b[100005],n;
ll sum,num,tot;
int main()
{
  while(~scanf("%d",&n))
  {
    sum=0;
    memset(b,-1,sizeof(b));
    for(int i=0;i<=n;i++)
      scanf("%d",&a[i]);
    for(int i=n;i>=0;i--)
      if(b[i]==-1)
      {
        for(tot=1;tot<=i;tot<<=1);//求比i大的2^k次方
        tot--;
        num=tot^i;
        sum+=tot*2;
        b[i]=num;
        b[num]=i;
      }
    printf("%I64d\n",sum);
    for(int i=0;i<=n;i++)
      printf(i==n?"%d\n":"%d ",b[a[i]]);
  }
  return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值