ZOJ

来源:互联网 发布:淘宝350客户端下载 编辑:程序博客网 时间:2024/06/05 17:29

这个题主要思路就是把每个数的二进制存到一个数组里存起来,因为瞎搞,瞎爆就是超时,当时在场上没做出来,后来看到题解后发现很简单,就是比较考验思路,当然我很菜,在场上没做出来。

#include<algorithm>#include<cstdio>#include<cstring>#include<queue>#include<stack>#include<set>#include<map>#include<iostream>#include<string>using namespace std;const int maxn = 100000 + 10;int  b[50], a[maxn];void decide(int x){    int l = 31;    while(l >= 0)    {        if(x & (1 << l))        {            b[l]++;            return;        }        l--;    }    return;}int main(){    int T;    cin >> T;    while(T--)    {        int N;        memset(b, 0, sizeof(b));        cin >> N;        for(int i = 0; i < N; i++)        {            scanf("%d", &a[i]);            decide(a[i]);        }        int ans = 0;        for(int i = 0; i < N; i++)        {            int l = 31;            while(l >= 0) // 判断从第几位开始数字为1            {                if((a[i] & (1 << l))) break;                l--;            }            while(l >= 0) // 判断哪位为0;            {                if(!(a[i] & (1 << l)))                {                    ans += b[l];                }                l--;            }        }        cout << ans << endl;    }    return 0;}

0 0