Card Collector(期望+min-max容斥)

博客围绕Card Collector问题展开,该问题是买方便面附赠卡牌,有n种卡,每种卡出现概率为pi,求集齐所有卡的期望购买包数。介绍了解题需理解单种卡期望购买包数的计算,指出直接将各卡期望相加错误,应采用容斥原理,最终得出min - max容斥公式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Card Collector(期望+min-max容斥)

Card Collector

woc居然在毫不知情的情况下写出一个min-max容斥

题意

买一包方便面有几率附赠一张卡,有\(n\)种卡,每种卡出现的概率是\(p_i\),保证\(\Sigma p_i \le 1\),集齐所有种类卡牌期望买多少包方便面?

解法

看次题解前,你必须要理解当只有一种卡,他出现的概率是\(p\),那么我期望购买$\frac 1 p $包方便面就可以获得这种卡。

否则请你右上角,因为博主不会解释...

唯一的解释就是:

(期望购买包数)\(\times\)(每包里面出现一张的概率)=(张数)

所以把概率除过去就好了...

我们想把所有\(\frac 1 p\)加起来,发现这样的错误的,原因是我们忽略了每次抽卡牌的时候可能抽到别的卡牌,把所有$\frac 1 p $加起来相当于必须抽到一张卡牌后才能抽到另一张,这样是不对的。

但是这样启示我们可以容斥,根据一些显然的概率原理(如果你不承认就右上角),出现\(1\)或者\(2\)号卡牌的概率是\(p_1+p_2\)。那么,\(\frac 1 {p_1+p_2}\)的意思是,我抽到一张\(1\)或者\(2\)的期望次数。那么,抽到一张\(1\)和一张\(2\)的期望次数就是
\[ 1/p_1+1/p_2-1/(p_1+p_2) \]
为什么我们的期望里要减去\(1/(p_1+p_2)\),因为我抽\(1\)的时候可能抽出\(2\),会省下一点期望,这个期望具体的值就是\(1/(p_1+p_2)\)(看不懂就右上角)。

所以我们就可以愉快地容斥了
\[ E(A)=\sum_{t \subseteq U}(-1)^{|t|}(\frac 1 {\sum _{p \in t}p}) \]

实际上,这个式子就是\(min-max\)容斥。

//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=25;
int num[maxn],n;
long double ans;
long double p[maxn];

int main(){
#ifndef ONLINE_JUDGE
      freopen("in.in","r",stdin);
      freopen("out.out","w",stdout);
#endif
      num[1]=1;
      for(register int t=2;t<maxn;++t)
        num[t]=num[t-1]<<1;
      while(~scanf("%ds",&n)){
        for(register int t=1;t<=n;++t)
          scanf("%Lf",&p[t]);
        for(register int t=1,edd=1<<n;t<edd;++t){
          long double delt=0;
          register int cnt=0;
          for(register int i=1;i<=n;++i)
            if(t&num[i]){
                  delt+=p[i];
                  ++cnt;
            }
          if(cnt&1) ans+=1.0/delt;
          else ans-=1.0/delt;
        }
        printf("%.4Lf\n",ans);
        ans=0;
      }
      return 0;
}

转载于:https://www.cnblogs.com/winlere/p/10828345.html

RtErrMsg SDService::InitBoostLog() { RtErrMsg ret; ret.code_ = kErr_Ok; if (boost_log_inited_) { return ret; // 已经初始化过了 } if (IsSDCardMounted()) { std::string log_dir = sdCardInfo_.mount_point_ + "/dac_log/logs"; std::size_t max_size = std::size_t(45ULL * 1024 * 1024 * 1024); LOG(INFO) << "Initializing Boost Log with directory: " << log_dir; init_logging(log_dir, max_size); boost_log_inited_ = true; } else { ret.code_ = kErr_NOTMounted; ret.msg_ = "SD card is not mounted, cannot initialize boost log"; return ret; } return ret; } void SDService::init_logging(const std::string& log_dir, std::size_t max_total_size_bytes) { // 1. 创建一个同步文件 sink,后端为 text_file_backend typedef sinks::synchronous_sink<sinks::text_file_backend> sink_t; boost::shared_ptr<sink_t> sink = boost::make_shared<sink_t>( // 文件名模式:xxx_HH:MM:SS_1h.log keywords::file_name = log_dir + "/dac_%Y-%m-%d-%H_1h.log", keywords::open_mode = std::ios_base::app); // 2. 每隔 1 小时滚动一次文件 sink->locked_backend()->set_time_based_rotation( sinks::file::rotation_at_time_interval(pt::hours(1))); // 3. 配置文件收集器(file collector) sink->locked_backend()->set_file_collector(sinks::file::make_collector( keywords::target = log_dir, // 日志存放目录 keywords::max_size = max_total_size_bytes, // 超过该总大小时开始删除最旧文件 keywords::min_free_space = std::size_t(1ULL * 1024 * 1024 * 1024) // (可选)保证的最小空闲空间 )); sink->locked_backend()->auto_flush(true); // 扫描现有文件以纳入管理 sink->locked_backend()->scan_for_files(); // 4. 设置日志记录格式(可选) sink->set_formatter(expr::stream << "[" << expr::format_date_time<boost::posix_time::ptime>( "TimeStamp", "%Y-%m-%d %H:%M:%S") << "] <" << trivial::severity << "> " << expr::smessage); // 5. 注册到 logging core boost_logging::core::get()->add_sink(sink); BOOST_LOG_TRIVIAL(info) << "Boost.Log initialized, trigger cleanup if needed."; } SD卡上已经有日志文件,总大小64G,已使用了49GB, 还剩11GB, 启动之后,最旧的日志文件并没有被删除
最新发布
06-28
### 单片机最小系统电路原理图设计 单片机最小系统的设计通常以核心处理器为中心,辅以外围支持电路完成基本功能。以下是针对 STC89C52 单片机构建的最小系统及其扩展模块(包括按键输入、温度传感器、加热灯控制和电源模块)的详细说明。 #### 1. **单片机最小系统** 单片机最小系统主要由 STC89C52 芯片、晶振电路、复位电路和供电电路组成。具体设计如下: - **晶振电路**:使用 11.0592MHz 的晶体振荡器两个 30pF 的瓷片电连接至 XTAL1 和 XTAL2 引脚,提供稳定的时钟信号[^1]。 - **复位电路**:通过一个 10kΩ 上拉电阻和一个 10μF 的电解电连接到 RST 引脚,实现手动复位功能[^1]。 - **供电电路**:为单片机提供 +5V 的稳定电压,建议加入滤波电以减少噪声干扰。 ```circuit // 晶振电路示意图 (伪代码表示) XTAL1 ---|<--- 30pF ---> GND | XTAL2 ---|<--- Crystal(11.0592MHz) --> GND ``` --- #### 2. **按键输入模块** 为了简化硬件设计并满足需求,可以采用独立式按键方案。每个按键占用一根 I/O 口线,适合小型控制系统中的少量按键应用[^5]。 - 使用三个点触式开关分别对应不同的功能键(如设置键、增加键和减小键),并通过限流电阻接入单片机的 P1 或 P2 端口[^5]。 ```circuit // 按键电路示意图 (伪代码表示) P1.0 -----> Button(SW1) ------> GND |----> Resistor(10kΩ) -> VCC ``` --- #### 3. **温度传感器模块** 温度传感器 DS18B20 是一种数字化温度测量芯片,能够直接将测得的温度值转换成数字信号传输给单片机[^1]。 - 将 DS18B20 的 DQ 数据引脚连接到单片机的一个 GPIO 引脚(例如 P3.7),同时在该引脚上串联一个 4.7kΩ 的上拉电阻。 - 提供 +5V 电源并地相连形成完整的回路。 ```circuit // 温度传感器电路示意图 (伪代码表示) DQ(Data Pin) ---->|<-- 4.7kΩ Resistor --> Single GPIO(P3.7) | GND --------------> Ground Connection VDD -------------> Power Supply(+5V) ``` --- #### 4. **加热灯控制模块** 对于加热灯的控制,可以通过继电器或者 MOSFET 实现对负载的有效切换。这里推荐使用 NPN 型三极管驱动 LED 加热灯[^3]。 - 连接方式为:单片机输出端经过限流电阻触发三极管基极;集电极接到加热灯正极端子,发射极接地;另外还需加反向二极管保护电路防止电流倒灌。 ```circuit // 加热灯控制电路示意图 (伪代码表示) GPIO(Output) ---->|<-- Base Resistor(1kΩ) --> Transistor(Base) | Heater Lamp (+) <-- Collector of Transistor Emitter ---------> GND Diode(Anti-Surge)-- Parallel to Heater Lamp ``` --- #### 5. **电源模块** 考虑到整个系统的功耗特性,可以选择 LM7805 稳压芯片来构建直流稳压源。 - 输入端接受未调整过的较高电压(比如 9~12V DC),经由 LM7805 后输出平稳可靠的 +5V 给各部分组件供电。 ```circuit // 电源模块电路示意图 (伪代码表示) Input Voltage(9~12VDC) ---->|<-- Capacitor(10uF) --> Input(LM7805) | Output Voltage(+5V) -------> Output(LM7805) |----> Capacitor(10uF) --> GND ``` --- ### 总结 以上描述涵盖了基于 STC89C52 单片机为核心的最小系统设计,并进一步介绍了如何集成按键输入、温度传感、加热灯光控以及必要的电源供应单元等内。这些组成部分共同构成了一个较为完善的嵌入式控制系统框架。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值