标签:style blog http color io os ar for strong
HDU 5014 Number Sequence ( 构造 )
题目意思:
给出一个数列 由0 - n 组成
然后需要构造一个数列 (也是由0-n组成),使得 sum(A[i] ^ B[i])的值最大。
分析:
异或不能出现比这个数大的情况,,所以要从大的数往前找。
现计算出当前判断数的二进制位的位数m,然后再与2^m - 1进行异或,这样会保证最大,具体为什么,自己可以想一想
比如: 5 - 101 -- 3位 - 对应 111
101 ^ 111 = 010
代码:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define MAXN 100005 #define CLR( a,b ) memset( a, b, sizeof(a) ) int a[MAXN], vis[MAXN], b[MAXN]; int cnt( int x ) { int ct = 0; while( x ) { ct++; x >>= 1; } return ct; } void Orz() { int n, pos; long long ans; while( ~scanf( "%d", &n ) ) { CLR( a, 0 ); CLR( b, 0 ); CLR( vis, 0 ); ans = 0; for( int i = n;i >=0; --i ) { if( vis[i] ) continue; int ct = cnt( i ); int tmp = i ^ ( ( 1 << ct) - 1 ); b[ tmp ] = i; b[ i ] = tmp; vis[i] = vis[tmp] = 1; ans += ( ( 1 << ct ) - 1 ) << 1; } printf( "%I64d\n", ans ); for( int i = 0; i < n; ++i ) { scanf( "%d", &pos ); printf( "%d ",b[pos] ); } scanf( "%d", &pos ); printf( "%d\n", b[pos]); } } int main() { Orz(); return 0; }
HDU 5014 Number Sequence ( 构造 )
标签:style blog http color io os ar for strong
原文地址:http://www.cnblogs.com/BigBallon/p/4038330.html