当前位置: 首页 > news >正文

翻转硬币(思维题,巧用bitset)

0翻转硬币 - 蓝桥云课

 

#include <bits/stdc++.h>
using namespace std;
bitset<200000001> t;
int main()
{
  int n;cin>>n;
  int ans=1;
  t[1]=1;
  int tot=n-1;
  for(int i=2;i<=n;i++){
    if(t[i]) continue;
    int j=i;
    ans++;
    while(j<=n){
      t[j]=!t[j];
      if(t[j]) tot--;
      else tot++;
      j+=i;
    }
    if(!tot) break;
  }
  cout<<ans;
  return 0;
}

这段代码中,bitset<200000001> t; 是一个非常关键的声明,它定义了一个名为 tbitset 对象,大小为 200,000,001 位(即 200,000,001 个布尔值)。bitset 是 C++ 标准库中的一个模板类,用于高效地存储和操作位(bit)序列。

在 C++ 中,bitset 的大小是固定的,必须在编译时确定。因此,bitset<200000001> 中的 200000001 是必须明确指定的,它表示 bitset 的大小为 200,000,001 位。如果不写这个大小,编译器会报错,因为 bitset 的大小是必须的。

1. bitset 的作用

bitset 是一种特殊的容器,它将每一位存储为一个布尔值(01)。它非常适合用于处理大规模的布尔状态数组,因为它的存储效率非常高,每一位只占用一个比特(bit)的空间,而不是一个字节(byte)。

在这个代码中,t 用于记录每个数字的状态。具体来说:

  • 如果 t[i]1,表示数字 i 被标记为“已处理”或“已翻转”。

  • 如果 t[i]0,表示数字 i 未被处理。

2. 为什么选择 bitset

  • 内存效率bitset 的内存占用非常小,因为它直接操作位,而不是使用更大的数据类型(如 boolint)。对于大规模数据(如 200,000,001 个数字),使用 bitset 可以显著减少内存占用。

  • 操作效率bitset 提供了高效的位操作方法,例如翻转、设置、清除等操作,这些操作的时间复杂度为 O(1)。

相关文章:

  • 30道Qt面试题(答案公布)
  • 【Python项目】信息安全领域中语义搜索引擎系统
  • 2012年上半年软件设计师上午题真题的详细知识点整理(附真题及答案解析)
  • 摄影——曝光三要素
  • OpenLayers总结3
  • [hgame 2025] week2 pwn/crypto
  • ShenNiusModularity项目源码学习(9:项目结构)
  • ActiveMQ之VirtualTopic
  • LM_Funny-2-01 递推算法:从数学基础到跨学科应用
  • DeepSeek V3原理
  • 代码随想录day14
  • SolidWorks速成教程P4-4【装配体 | 第四节】——装配体内修改模型编辑配合方法配合报错的解决方法
  • 在华为云部署应用,通过阿里云代理调用第三方接口的利弊与解决方案
  • module ‘cv2.dnn‘ has no attribute ‘DictValue‘解决办法
  • 电力交易员需要哪些证书
  • 安装MinkowskiEngine记录
  • 解决DeepSeek服务器繁忙的有效方法
  • mapbox基础,使用geojson加载circle圆点图层
  • 燧光 XimmerseMR SDK接入Unity
  • nginx 搭建
  • 沃旭能源因成本上升放弃英国海上风电项目,或损失近40亿元
  • 虚假认定实质性重组、高估不良债权价值,原中国华融资产重庆分公司被罚180万元
  • 来论|建设性推进缅北和平进程——中国的智慧与担当
  • 外交部答澎湃:美方攻击抹黑中加关系与合作的卑劣图谋不会得逞
  • 上海“随申兑”服务平台有哪些功能?已归集800余个惠企政策
  • 上交现场配乐4K修复版《神女》:默片巅峰有了新的打开方式