hdu 5014 贪心+位处理

来源:互联网 发布:工业生产总值数据 编辑:程序博客网 时间:2024/06/16 11:58

http://acm.hdu.edu.cn/showproblem.php?pid=5014
题意略。
分析: 通过发现规律贪心处理即可,从n开始反向遍历到0,假设与数i匹配的是 Xi;
那么i^Xi的二进制位一定全1,并且二进制位数等于i的二进制位数

#include <iostream>#include <stdio.h>#include <string>#include <string.h>#include <algorithm>const int N=1e5+100;using namespace std;typedef long long ll;int a[N];int b[N];int main(){    int n;    while(scanf("%d",&n)!=EOF)    {        memset(b,-1,sizeof(b));        for(int i=0;i<=n;i++)scanf("%d",&a[i]);        ll sum=0;        for(int i=n;i>=0;i--)        {           if(b[i]!=-1)continue;           int tmp=i,ans=0,cnt=1;           while(tmp)           {             if((tmp&1)==0)ans+=cnt;             tmp>>=1;             cnt*=2;           }          sum+=2*(i^ans);          b[i]=ans;          b[ans]=i;        }        printf("%I64d\n",sum);        for(int i=0;i<=n;i++)        {          if(i==0)printf("%d",b[a[i]]);          else printf(" %d",b[a[i]]);        }        printf("\n");    }    return 0;}
0 0
原创粉丝点击