给你n个数 问有多少种情况 两两异或大于两个数中的最大值;
分析 如果a小于b 及大的为b 要想a^b大于b 及a的最高位(一定为1)与b的对应位不一样 及b的对应位为0 就一定满足 这样就转换为小的数的对应位
先排序 mark【i】表示i这个位置为0的数的个数
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> using namespace std; int num[100010]; int cmp(int a,int b) { return a>b; } int main() { int T,i,j,n; scanf("%d",&T); while(T--) { scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&num[i]); } sort(num+1,num+1+n,cmp); int record[100],mark[100]; memset(record,0,sizeof(record)); int ans=0; for(i=1;i<=n;i++) { j=1; int x=num[i]; while(x) { mark[j++]=x%2; x/=2; } ans+=record[j-1]; for(int k=1;k<j;k++) if(!mark[k]) record[k]++; } printf("%d\n",ans); } return 0; }
时间: 2024-08-25 00:20:35