博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
zoj 3870 Team Formation
阅读量:4944 次
发布时间:2019-06-11

本文共 1848 字,大约阅读时间需要 6 分钟。

题意:

给出n个数,问做多可以找到多少对数字A,B,使得A xor B > max(A,B)。

思路:

感谢mzjj教本弱智。

对于一个数,只考虑小于它的数字。

假设对于一个数字x 11001001,对于从最高位开始的连续的1,满足条件的数y的这位一定不能为1,从碰到的第一位0开始:这一位就可以是1,后面无论是什么都可以满足条件;

如果这位不为1,那么直到碰到下一个0之前,都不能是1。

所以可以从小到大枚举,按最高位分组,对于当前来到的x,枚举它的0的位有多少,答案加上以这位为最高位的数字的个数。

然后把这个数字加进分组中。

一开始把b数组只开了10,以为10的9次方最多10位,确实是,但是那是10进制,二进制就是32位了,睿智了Orz。

我的代码:

1 #include 
2 #include
3 #include
4 using namespace std; 5 const int N = 1e5 + 10; 6 int a[N]; 7 int b[35]; 8 int main() 9 {10 int t;11 scanf("%d",&t);12 while (t--)13 {14 memset(b,0,sizeof(b));15 int n;16 scanf("%d",&n);17 for (int i = 0;i < n;i++)18 {19 scanf("%d",&a[i]);20 }21 sort(a,a+n);22 long long ans = 0;23 for (int i = 0;i < n;i++)24 {25 int x = a[i];26 int cnt = 0;27 while (x)28 {29 if (!(x & 1)) ans += b[cnt];30 cnt++;31 x >>= 1;32 }33 if (cnt == 0) continue;34 b[cnt-1]++;35 }36 printf("%lld\n",ans);37 } 38 return 0;39 }

学长的代码:

1 #include 
2 using namespace std; 3 typedef long long LL; 4 const int N = 1e5 + 5; 5 int T, n; 6 int a[N]; 7 int cnt[33]; 8 9 int main() {10 scanf("%d", &T);11 while(T--) {12 scanf("%d", &n);13 for(int i = 0; i < n; i++) {14 scanf("%d", &a[i]);15 }16 sort(a, a+n);17 memset(cnt, 0, sizeof(cnt));18 LL ans = 0;19 for(int i = 0; i < n; i++) {20 int x = a[i];21 int b = 31 - __builtin_clz(x);//返回左起第一个‘1’之前0的个数。22 for(int j = 0; j < b; j++) {23 if(~x&(1<

 

转载于:https://www.cnblogs.com/kickit/p/9000699.html

你可能感兴趣的文章
Python 使用字符串
查看>>
Quartz Core之CALayer
查看>>
java:一个项目的开发过程(转)
查看>>
express框架学习笔记
查看>>
操作系统下载路径
查看>>
网站开发 关于图片压缩 以及图片使用
查看>>
hive的count(distinct id)测试--慎用
查看>>
第九周周总结
查看>>
Logistic Regression
查看>>
8lession-基础类型转化
查看>>
FlashCS5作成SWC,在Flex4中使用(1)
查看>>
vue-cli目录结构及说明
查看>>
JS 数据类型转换
查看>>
WeQuant交易策略—RSI
查看>>
osgearth将视点绑定到一个节点上
查看>>
PHP 当前时间秒数+数值,然后再转换成时间。
查看>>
数据交互 axios 的使用
查看>>
bootloader,kernel,initrc
查看>>
Java中jshell脚本
查看>>
performSelector的方法
查看>>