zoj 3870 Team Formation
2015-08-18 09:50
183 查看
题目大意:所给的一个数组中任意两个数异或值大于这个两个数,即i^j > max(i, j),问有多少个这样的异或
1^1 = 0, 0^0 = 0, 1^0 = 1, 0^1 = 1
如果x的最高位i位是1,y的位是0,且y比x大,i不是y的最高位,异或后这一位变成1,且yi位以前的1也可以保存,则异或后肯定比两个数的最大值还大
先把数组用快排从大到小排一下序, 再把每个数转分别换为二进制,在二进制中是 0 的就在相应的位置加 1, 另外如果首位是 1 的话,就把 ans(最后求的值) 加上相应位置上的值
举个例子:
5
1 2 3 4 5
快排后是: 5 4 3 2 1
对应的二进制是:
0 0 0 0
1 0 1 b[1]++;
1 0 0 b[1]++, b[0]++;
1 1 ans+= b[1];
1 0 b[0]++, ans+= b[1];
1 ans+= b[0];
View Code
1^1 = 0, 0^0 = 0, 1^0 = 1, 0^1 = 1
如果x的最高位i位是1,y的位是0,且y比x大,i不是y的最高位,异或后这一位变成1,且yi位以前的1也可以保存,则异或后肯定比两个数的最大值还大
先把数组用快排从大到小排一下序, 再把每个数转分别换为二进制,在二进制中是 0 的就在相应的位置加 1, 另外如果首位是 1 的话,就把 ans(最后求的值) 加上相应位置上的值
举个例子:
5
1 2 3 4 5
快排后是: 5 4 3 2 1
对应的二进制是:
0 0 0 0
1 0 1 b[1]++;
1 0 0 b[1]++, b[0]++;
1 1 ans+= b[1];
1 0 b[0]++, ans+= b[1];
1 ans+= b[0];
#include<stdio.h> #include<stdlib.h> #include<string.h> #define N 100010 int ans, a , b[110], c[110];//注意b,c的数组不能开太大,否则TLE(开始为图省事直接用N,直接TLE) int cmp(const void *a, const void *b) { return *(int *)b - *(int *)a; } void slove(int n) { int i, j = 0; memset(c, 0, sizeof(c)); while(n) { c[j++] = n % 2; n /= 2; }//将n转化成二进制 if(c[j - 1])//如果最高位是1与0异或其值必然大于这两个数,所以ans直接加上相应位置的值 ans += b[j - 1]; for(i = 0 ; i < j ; i++) if(!c[i]) b[i]++;//c中等待1异或的0元素个加1 } int main() { int n, t, i; scanf("%d", &t); while(t--) { ans = 0; memset(b, 0, sizeof(b)); scanf("%d", &n); for(i = 0 ; i < n ; i++) scanf("%d", &a[i]); qsort(a, n, sizeof(a[0]), cmp); for(i = 0 ; i < n ; i++) slove(a[i]); printf("%d\n", ans); } return 0; }
View Code
相关文章推荐
- (大数据工程师学习路径)第五步 MySQL参考手册中文版----初识MySQL
- 2006年中国首届杰出数据库工程师评选获奖名单
- eclipse调试模式不能显示源码解决
- ibatis缓存机制cacheModel
- mybatis 根据参数映射对应模型
- func 和action 委托的使用
- 我的openwrt学习笔记(二):OpenWrt 开发环境搭建
- Java中删除List中的某些数据的方法
- Unity中针对Android Apk的签名验证(C#实现)
- java基础知识回顾——集合
- 你还在写一堆的findViewById()吗?
- Andriod下载源码导入后AndroidManifest.xml小红叉的解决办法
- 汉化pycharm4.5.3方法
- 解决 vs2010问题 error MSB8008: 指定的平台工具集(v110)未安装或无效
- 对象的比较及hashCode、equals方法的使用
- CSS选择器及用法
- 无法找到 PInvoke DLL“sqlceme30.dll”
- POJ 2531 Network Saboteur(DFS)
- USB之(六)USB设备驱动
- HDU 3466