第十四届蓝桥杯大赛软件赛省赛-试题 B---01 串的熵 解题思路+完整代码

蓝桥杯高频知识点(上) a,出现在a,ab,abc + ba,bab,babc + aba,abab,ababc,有重复子串 aba,abab,ababc(这几个其实第一个a已经包含过它们了,所以只需要从a算到b a,前面的可以删去不用,因为之前的情况前面的a已经贡献过了),最后算得贡献值为6,b,出现在了b,bc + ab,abc +bab,babc + abab,ababc,含有相同字符的前串bab ,babc,abab,ababc可以去掉,最后算得贡献值为4,ba,bab,babc,a,ab,abc。 阅读详情

欢迎访问个人网站来查看此文章:http://www.ghost-him.com/posts/db23c395/

问题描述

对于一个长度为 n 的 01 串 S=x1x2x3...xnS = x_{1} x_{2} x_{3} ... x_{n}S=x1​x2​x3​...xn​,香农信息熵的定义为 H(S)=−∑1np(xi)log2(p(xi))H(S ) = − {\textstyle \sum_{1}^{n}} p(x_{i})log_{2} (p(x_{i}))H(S)=−∑1n​p(xi​)log2​(p(xi​)),其中 p(0)p(0)p(0), p (1)(1)(1) 表示在这个 010101 串中 000 和 111 出现的占比。比如,对于 S=100S = 100S=100 来说,信息熵 H(S)=−13log2(13)−23log2(23)−23log2(23)=1.3083H(S ) = − \frac{1}{3} log_{2} ( \frac{1}{3} ) − \frac{2}{3} log_{2}( \frac{2}{3} ) − \frac{2}{3} log_{2} ( \frac{2}{3} ) = 1.3083H(S)=−31​log2​(31​)−32​log2​(32​)−32​log2​(32​)=1.3083。对于一个长度为 233333332333333323333333 的 010101 串,如果其信息熵为 11625907.579811625907.579811625907.5798,且 000 出现次数比 111 少,那么这个 010101 串中 000 出现了多少次?

思路

我们先来看这个 h(s)h(s)h(s) 的定义,然后先把 h(s)h(s)h(s) 这个函数写出来。

我们看这个 100100100 的例子:一共有 1 个 1,2 个 0,h(s)h(s)h(s) 也是由 1 个 −13log2(13)− \frac{1}{3} log_{2} ( \frac{1}{3} )−31​log2​(31​) 和 2 个 −23log2(23)− \frac{2}{3} log_{2}( \frac{2}{3} )−32​log2​(32​) 构成,再根据公式,我们可以推测:如果有 n 个 0,m 个 1,那么 h(s)h(s)h(s) 应该是由 n 个 p(0)log2(p(0))p(0)log_{2}(p(0))p(0)log2​(p(0)) 构成,同时,由 m 个 p(1)log2(p(1))p(1)log_{2}(p(1))p(1)log2​(p(1)) 构成。p(0)p(0)p(0) 表示 0 出现的占比,p(0)=nn+mp(0) = \frac{n}{n + m}p(0)=n+mn​ ,p(1)=mn+mp(1) = \frac{m}{n + m}p(1)=n+mm​。所以我们可以设一个函数,用来求解 h(s)h (s)h(s)。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>

using namespace std;

int gcd(int a, int b) {
	return b ? gcd(b, a % b) : a;
}

// p0 表示 '0' 出现的次数;p1表示 '1' 出现的次数
double h(int p0, int p1) {
	// 需要将 3/6 化简成 1/2 这样的形式,简化运算的时间
	// 将分子和分母共同除以它们的最大公因数即可。
	int t0 = p0, t1 = p1;
	// 获取最大公因数
	int t = gcd(t0, t1);
	// 化简
	t0 /= t, t1 /= t;
	// 获取总数
	double t2 = t0 + t1;
	// 返回的答案
	double res = 0;
	// 套入公式
	res -= p0 * (t0 / t2) * (log2(t0) - log2(t2));
	res -= p1 * (t1 / t2) * (log2(t1) - log2(t2));
	return res;
}

int main () {
	// 100 由 2个0 和 1个1 组成,代入函数以验证函数的正确性
	cout << h(2, 1) << endl;
	
	return 0;
}

可得运行结果:

1.30827

与题目中的结果一致,说明我们写的代码是正确的。

接下来我们就应该来求这个题目的答案了。

我们先来看看这个函数的性质:我们多求几组数字。我们以长度为 10 的所有 01 串来看:

int main () {
	cout << h(9, 1) << endl;
	cout << h(8, 2) << endl;
	cout << h(7, 3) << endl;
	cout << h(6, 4) << endl;
	cout << h(5, 5) << endl;
	cout << h(4, 6) << endl;
	cout << h(3, 7) << endl;
	cout << h(2, 8) << endl;
	cout << h(1, 9) << endl;
	return 0;
}

可得运行结果:

1.56342
2.98911
4.08468
4.76816
5
4.76816
4.08468
2.98911
1.56342

我们可以发现:

  1. h(s)h(s)h(s) 关于 5 对称
  2. 在对称轴的一侧,h(s)h(s)h(s) 的值单调

由于题目中说明:且 0 出现次数比 1 少 ,所以,0 的个数一定小于总数的一半,所以 0 的数量越多,熵越大。我们知道了这个性质以后,可以采用二分的方法,将 0 的数量二分出来。

int main () {
	// 0 的数量最小是 1, 最大是 (23333333 + 1) / 2 (总数的一半)
	int l = 1, r = (23333333 + 1) / 2;
	while (l < r) {
		// 获取当前判断的 0 的数量
		int mid = l + r >> 1;
		// 如果熵大于目标值,说明 0 的数量太多了,要减小 0 的数量
		// 如果熵小于目标值,说明 0 的数量太少了,要增加 0 的数量
		if (h(mid, 23333333 - mid) > 11625907.5798) r = mid; // 减少 0
		else l = mid + 1; // 增加 0
	}
	cout << l << endl;
	return 0;
}

可得:

11027421

然后我们再验证一下这个结果:

int main () {
	printf("%.10lf", h(11027421, 23333333 - 11027421));
	return 0;
}

得结果:

11625907.5798144601

正确

答案

11027421

完整的代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>

using namespace std;

int gcd(int a, int b) {
	return b ? gcd(b, a % b) : a;
}

double h(int p0, int p1) {
	int t0 = p0, t1 = p1;
	int t = gcd(t0, t1);
	t0 /= t, t1 /= t;
	double t2 = t0 + t1;
	double res = 0;
	
	res -= p0 * (t0 / t2) * (log2(t0) - log2(t2));
	res -= p1 * (t1 / t2) * (log2(t1) - log2(t2));
	return res;
}

int main () {
	int l = 1, r = (23333333 + 1) / 2;
	while (l < r) {
		int mid = l + r >> 1;
		if (h(mid, 23333333 - mid) > 11625907.5798) r = mid;
		else l = mid + 1;
	}
	cout << l << endl;
	return 0;
}
第十四届蓝桥杯单片机组(赛题+程序) 第十四届蓝桥杯单片机组(赛题+程序) 考于2023.4.8 ,于2023.4.28 复盘。 今年的题目是比较难的了,模块多,而且逻辑也更加复杂,考了NE555、I2C、DS1302、DS18B20,同时客观题也不好做。笔者客观题只对3个,程序题大概完成80%,勉强进入省一。 阅读详情

相关推荐

第十四届蓝桥杯大赛软件赛省赛 C/C++ 大学 B 组

如何算,sum[i]代表从根走到i节点需要花多少时间,那么从u到v(后文表示为dis(u,v))则需要花sum[u]+sum[v]-sum[lca(u,v)]*2这么多时间,如果删去一个点i后,全程答案为 asum - dis(a[i],a[i+1]) - dis(a[i],a[i-1]) + dis(a[i-1],a[i+1]),删掉开头和结尾特判,入代码所示。对结尾字符出现次数做前缀和,枚举a字符开头的位置,假设s[i]是a字符,那么i+k-1以后的出现的b都可以作为答案。复杂度:O(nlogn)

m0_51687577的博客 6578

(第十四届蓝桥真题)01串的熵

分析:这道题只要看明白了题意直接暴力即可,先枚举0的个数cnt0,然后1的个数就是23333333-cnt0,那么我们直接计算这个对应的信息熵即可,注意精度取到1e-4即可。

AC__dream的博客 2875

第十四届蓝桥杯大赛软件赛省赛(C/C++ 大学C组)

第十四届蓝桥杯大赛软件赛省赛 C/C++ 大学 C 组

NOW I GOT ONE WAY 1万+

B.01串的熵

蓝桥杯2023年第十四届省赛真题-01串的熵

今天也要加油呀ʕ ᵔᴥᵔ ʔ 712

第十四届蓝桥杯大赛软件组省赛 Python大学A组 个人暴力题解

A, B, C, D, E, F, G, H, I, J

NEFU AB-IN's Blog 8918

蓝桥杯国赛C++ B组攻略:从状压DP到任务调度模拟的实战解析

动态规划(DP)是解决最优化和计数问题的核心算法思想,其本质是将复杂问题分解为重叠子问题,并通过状态转移方程递推求解。状态压缩DP作为其重要分支,常用于处理棋盘覆盖等NP难问题,通过二进制位压缩状态,将高维空间映射到一维进行高效求解。在工程实践中,DP与深度优先搜索(DFS)结合,能有效解决组合爆炸问题,例如在蓝桥杯等算法竞赛的铺砖、任务调度等场景中。本文以蓝桥杯国赛典型题目为例,深入剖析状态压缩DP在棋盘覆盖问题中的建模与实现,并详解优先队列在事件驱动模拟中的应用,帮助读者掌握从问题抽象到代码落地的完整路

weixin_33861800的博客 354

第十四届蓝桥杯大赛软件赛省赛(C/C++ 大学B组)

第十四届蓝桥杯大赛软件赛省赛(C/C++B组)

执梗的博客 1万+

解决 NLPIR (中科院分词) License 过期问题

因为学习需要,使用到了中文分词技术,网上搜索一番,最终选择了名气比较大的中科院分词器(NLPIR/ICTCLAS)。 用了几个月之后突然报错: E:\code\URLClassifier\Data\NLPIR.user Not valid license or your license expired! Please feel free to contact pipy_zhan

勇敢向前冲 1万+

2023年第十四届蓝桥杯JavaB组省赛真题及全部解析(上)

2023年第十四届蓝桥杯Java B组省赛全部解析(上)。

2301_80035594的博客 2388

【SABRE 3D, SABRE 3DxT,LAM设备】2025年9月13日-安全配置-准备工作

请遵循本规程将SABRE 3D/3DxT/3D Scimitar系统设置为安全配置,以便能够在电镀单元、APT模块、XMM(或SRD)模块、工厂接口(FI)外壳或中央通道内部及周边区域执行作业p104-p117。在生产过程中暂停调度程序存在一定风险:若待维护模块未离线且在其他模块完成处理前重启调度程序,可能对生产晶圆造成影响。维护人员需特别注意电镀模块内的晶圆状态,并尽可能快速地恢复调度程序。确认待维护模块内无晶圆滞留暂停调度程序并将相应模块设置为离线状态打开模块检修门并关闭安全盖板(槽位)

weixin_46735260的博客 1368

Qt·DBus快速入门

DBus快速入门

m0_64560763的博客 2273

第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组

第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组,试题 A: 日期统计 .本题总分:5 分 试题 B: 01 串的熵.本题总分:5 分 试题 C: 冶炼金属.本题总分:10分 试题 D: 飞机降落.本题总分:10分 试题 E: 接龙数列.本题总分:15分 试题 F: 岛屿个数.本题总分:15分 试题 G: 子串简写.本题总分:20分 试题 H: 整数删除.本题总分:20分 试题 I: 景区导游 .本题总分:25分 试题 J: 砍树 .本题总分:25分

qq_52760486的博客 2020

GPS定位不准?可能是GDOP在作怪!手把手教你优化卫星几何分布

本文深入解析了GPS定位精度不佳的常见原因——几何精度因子GDOP。通过剖析卫星几何分布对定位误差的放大效应,文章提供了从理解GDOP、PDOP、HDOP等关键指标,到使用专业APP实时诊断卫星天空图,再到利用在线工具提前规划最佳定位时机的完整实战指南。旨在帮助户外爱好者、无人机飞手及专业用户主动优化卫星几何条件,从而显著提升定位可靠性。

weixin_29062823的博客 306

2023第十四届蓝桥杯Java大学生A组真题?(真题+附链接)

其中 arr[0] = (In[0], In[1], In[2], In[3], In[4]) 表示的是输入数据,对于某 个 arr[i][ j](i ≤ 0),计算方式为 arr[i][ j] = arr[i − 1][ j] op arr[i − 1][ j + 1],其中 op 表示的是将 arr[i − 1][ j]、arr[i − 1][ j + 1] 作为输入,将 arr[i][ j] 作为输出的那个门电路,与门、或门、异或门分别对应于按位与 (&)、按位或 (|)、按位异或 (^) 运算符。

m0_74939018的博客 796

秋叶ComfyUI整合包:一键部署AI绘画工作流,解决环境配置难题

在AI绘画和生成式AI领域,Stable Diffusion作为开源的扩散模型,为图像生成提供了强大的技术基础。其核心原理是通过学习数据分布,对随机噪声进行逐步去噪,最终生成高质量的图像。这项技术的价值在于极大地降低了专业图像创作的门槛,并推动了AIGC(人工智能生成内容)在艺术设计、游戏开发、广告营销等场景的广泛应用。然而,其典型工作流实现工具ComfyUI,在实际部署中常因Python环境、PyTorch版本与CUDA驱动之间的复杂依赖关系而受阻,尤其是面对NVIDIA 30系、40系及未来50系等不同

优快云头条 674

别再被systemd-resolved坑了!银河麒麟V10下用Bind9搭建内网DNS的完整避坑指南

本文详细介绍了在银河麒麟V10和Ubuntu系统下部署Bind9 DNS服务器时,如何解决与systemd-resolved的端口冲突问题。提供了五种专业级解决方案,包括彻底禁用systemd-resolved、智能端口转发等,并特别针对银河麒麟V10的安全加固需求给出了配置建议和诊断工具,帮助用户高效搭建内网DNS服务。

weixin_30342209的博客 658

第十五届蓝桥杯大赛软件赛省赛Python 大学 B 组

第十五届蓝桥杯大赛软件赛省赛Python 大学 B 组(题解)

m0_73346043的博客 852

基于imx6ull平台opencv的图像采集、ffmpeg推流和Windows端拉流(多线程)

本文档是针对imx6ull平台`opencv`的图像采集、ffmpeg推流和Windows端拉流。首先创建一个线程`opencv`通过摄像头采集视频图像,接着再创建两个线程,其中一个线程获取采集的视频图像送给ffmpeg服务,另一个线程用于获取采集的视频图像并处理,处理完并在显示屏上显示,详细的流程请参看如下。

程小二的博客 1607

第十六届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组(个人见解,已完结)

加油.

wljy1的博客 1942

第一章:信号链的精度之战:深入解决电流采样偏差

摘要:本文深入探讨了FOC控制中电流采样偏差问题及其解决方案。电流采样偏差主要来源于偏移误差、增益误差、非线性误差和温漂四大类,其中偏移误差对FOC性能影响最为严重。硬件方面建议采用高精度采样电阻、低失调运放和独立基准电压等设计;软件层面提出了上电自动零点校准、在线实时补偿和模型闭环补偿三种策略。最后介绍了量产自动化校准系统,通过硬件优化和软件补偿相结合,确保每台产品电流采样精度的一致性,为FOC控制奠定坚实基础。

汽车软件开发 603

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

第十三届蓝桥杯c++b组2022年国赛决赛题解

题目pdf下载:十三届蓝桥杯c++b组2022国赛题目pdf下载 G题没有写,J题是暴力的,其他好像都写出来,但是估计还是有错的。

hjc的博客 2万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

第十届蓝桥杯大赛软件类省赛 Java 大学 B组 试题B:不同子串

问题描述 方法一 package com.gxwz.lanqiaobei; import java.util.ArrayList; import java.util.List; /** * 不同子串 * @author com * */ public class JavaB2019 { // static String str = "aaab"; //substring[...

星辰大数据的博客 1516

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

第十七届蓝桥杯国赛C++ B组 个人题解+考场思路复盘及备赛经验

蓝桥杯国赛个人题解+考场思路复盘及备赛经验

2401_87563614的博客 761

蓝桥杯真题每日一练:算法能力提升与高效刷题方法论

算法是计算机科学的核心基础,其本质是通过特定步骤解决问题的方法论。理解算法原理,如动态规划、深度优先搜索等,能有效提升逻辑思维与问题分解能力,在软件开发、数据分析等领域具有极高技术价值。对于准备技术面试或编程竞赛的学习者,系统性的真题训练是巩固知识、洞察考点的高效途径。本文聚焦蓝桥杯真题,结合动态规划、深度优先搜索等高频考点,拆解从审题到调试的完整解题流程,并提供四步刷题法等实用学习框架,帮助读者构建扎实的算法知识体系与解题思维。

weixin_30292745的博客 430

蓝桥杯算法竞赛实战指南:从真题解析到工程思维迁移

算法是计算机科学的核心基础,它通过定义明确的计算步骤来解决特定问题。其原理在于将复杂问题分解为可管理的子问题,并利用数据结构高效组织与操作数据。掌握算法能显著提升程序的执行效率与资源利用率,具备极高的技术价值。在工程实践中,算法思维广泛应用于数据处理、路径规划、资源分配和系统优化等场景,例如使用哈希表与堆处理海量日志统计,或运用动态规划优化服务器资源配额。本文以蓝桥杯竞赛真题为切入点,深入剖析搜索、动态规划、贪心等核心算法在解决实际问题时的应用技巧与避坑指南,帮助读者构建坚实的算法基础与迁移能力。

weixin_33811539的博客 487
上一篇: 快速求解组合数
下一篇: 第十四届蓝桥杯大赛软件赛CB国赛-填空题(题目解析+完整代码)
ghost_him
博客等级 码龄6年 598粉丝 90原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值