第 9 场 小白入门赛 字典树考试

题目:

4.字典树考试【算法赛】 - 蓝桥云课 (lanqiao.cn)

思路:

我们可以先抛开题目,想一下一个二进制数是 1 1 1 1 1 1 1 1 1  ---> 9个1,题目说(Ai & Aj)所以两个1一个组合, 我们用最笨的方式取枚举 -----> 是 8 + 7+ 6 + 5+ ....... + 1 是36

两两一组,想想X个1如何算呢 ?

是不是应该是 x * (x-1) / 2  

换到此题中,两个数相同的数位是1才能为答案做1个贡献,所以我们计算每个数位上1的总数,然后求出结果

我们按位来考虑问题,考虑每个“位”对答案的贡献考虑这个数组的第b位对答案的贡献,显然只有第b位为1才可能对答案有贡献。
任选两个第 b位为1的,即可产生1的贡献。假设有t个第b位为1的。故这一位的贡献为,累加每一位的贡献即可 


AC代码: 

#include <iostream>

using namespace std;

typedef long long ll;
const int N = 2e5+10;
ll arr[N];

int main()
{
  cin.tie(0)->ios::sync_with_stdio(false);
  // 请在此输入您的代码
  int n;
  cin >> n;
  for(int j=0;j<n;j++)
  {
      ll x;
      cin >> x;
      for(int i=0;i<31;i++)
      {
          //这里要注意需要&1才能把这个位单独取出来
          //这里本人忘了&1直接 >> 取 是非常不对的,因为 >> 这个是除2的意思
          int bit = x >> i & 1;
          if(bit == 1) ++arr[i];
      }
  }
  ll res = 0;
  for(int i=0;i<31;i++)
  {
      //这里是个公式推到res = x * (x-1) / 2; 
      res += arr[i] * (arr[i]-1) / 2;
  }
  cout << res;
  return 0;
}

相关推荐

  1. 9 入门 字典考试

    2024-04-09 21:36:01       34 阅读
  2. 蓝桥杯 9 入门 字符迁移

    2024-04-09 21:36:01       42 阅读
  3. 9 入门 -- 蓝桥杯

    2024-04-09 21:36:01       34 阅读
  4. 蓝桥杯 9 入门 盖印章

    2024-04-09 21:36:01       31 阅读
  5. 蓝桥杯 入门

    2024-04-09 21:36:01       57 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-09 21:36:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-09 21:36:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-09 21:36:01       82 阅读
  4. Python语言-面向对象

    2024-04-09 21:36:01       91 阅读

热门阅读

  1. python爬虫基础知识整理(2)

    2024-04-09 21:36:01       34 阅读
  2. SQL语言

    SQL语言

    2024-04-09 21:36:01      37 阅读
  3. 如何使用Docker容器化改善你的开发流程

    2024-04-09 21:36:01       38 阅读
  4. == 和 ===什么区别呀?

    2024-04-09 21:36:01       31 阅读
  5. Pandas追加写入文件的时候写入到了第一行

    2024-04-09 21:36:01       32 阅读