hdu5014——构造打表找规律
来源:互联网 发布:杰科网络电视机顶盒r1 编辑:程序博客网 时间:2024/04/30 11:41
题意给你一个序列,1---n,你安排另一个1---n的序列顺序,使得按位异或最后加起来和最大。。那么就是贪心高位,也就是从后往前了。
#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>using namespace std;int a[100005];int b[100005];int n;int fin(int x){ int temp=0; int ret=0; int i=0; while(x){ temp=((x&1)^1); ret=(temp<<i)+ret; ++i; x/=2; } if(b[ret]==-1){ return ret; } else{ return -1; }}void init(){ for(int i=n-1;i>0;i--){ if(b[i]!=-1) continue; int x=fin(i); if(x!=-1){ b[i]=x; b[x]=i; } } return;}int main(){ while(cin>>n){ n++; memset(b,-1,sizeof(b)); for(int i=0;i<n;i++){ scanf("%d",&a[i]); } init(); long long ans=0; if(n%2==1) b[0]=0; for(int i=0;i<n;i++){ ans+=(a[i]^b[a[i]]); } cout<<ans<<endl; for(int i=0;i<n;i++){ if(i!=n-1) printf("%d ",b[a[i]]); else printf("%d\n",b[a[i]]); } } return 0;}
这题做的时候略坑了。。。一眼看出贪心然后发现又遇到了问题,一下写不出来了。。第二天吧n是偶数的时候用next_permutation打表爽了一下。发现n是偶数的时候0异或0剩下贪心一下依旧是,于是从后往前贪心一下,按位取反一下,用到 ((x&1)^1) 再把每次新求到的位放到前面就行了 。代码如下:
0 0
- hdu5014——构造打表找规律
- 数学发现规律+hdu5014
- hdu5014——Number Sequence
- hdu5014 构造b数列使得t最大(小想法)
- HDU 6172 Array Challenge(打表找规律+构造矩阵)
- SGU 107 —— 打表找规律
- HDU5014:Number Sequence
- 规律?混乱——习惯
- Steps——找规律
- HDU6154——找规律
- 【HDU】5244 inverse【打表找规律——FFT】
- Parity check——打表找规律+大数取模
- 泛数独终盘构造法一 及其中规律
- hdu4731(字符串构造+找规律)
- rockethon2015 B题 Permutations 规律+构造
- HDU 4731 Minimum palindrome(规律 构造)
- UESTC - 1264:人民币的构造【规律】
- 51Nod - 1655 找规律 + 构造
- 3998: [TJOI2015]弦论 后缀自动机
- BZOJ 3531 SDOI2014 旅行(travel) 树链剖分模板题
- Observable和Observer
- 全排列 枚举
- VC6.0 fatal error C1853: 'Debug/xx.pch' is not a precompiled header
- hdu5014——构造打表找规律
- Android Toast的学习与简单应用
- 解决Android中的SQLite数据库并发访问
- Mac下Cornerstone无法查看SVN日志的问题的解决办法
- Java——JDOM方式生成XML
- Linux:使用awk命令获取文本的某一行,某一列
- gradle使用学习(一)————环境与配置
- arm-linux-gcc.tgz安装
- 【面试笔试算法】Program 2:Amusing Digits(网易游戏笔试题)