第十四届蓝桥杯大赛软件赛省赛-试题 B---01 串的熵 解题思路+完整代码
欢迎访问个人网站来查看此文章:http://www.ghost-him.com/posts/db23c395/
问题描述
对于一个长度为 n 的 01 串 S=x1x2x3...xnS = x_{1} x_{2} x_{3} ... x_{n}S=x1x2x3...xn,香农信息熵的定义为 H(S)=−∑1np(xi)log2(p(xi))H(S ) = − {\textstyle \sum_{1}^{n}} p(x_{i})log_{2} (p(x_{i}))H(S)=−∑1np(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)=−31log2(31)−32log2(32)−32log2(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} )−31log2(31) 和 2 个 −23log2(23)− \frac{2}{3} log_{2}( \frac{2}{3} )−32log2(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
我们可以发现:
- h(s)h(s)h(s) 关于 5 对称
- 在对称轴的一侧,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; // 减少 0else 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;
}
相关文章:
第十四届蓝桥杯大赛软件赛省赛-试题 B---01 串的熵 解题思路+完整代码
欢迎访问个人网站来查看此文章:http://www.ghost-him.com/posts/db23c395/ 问题描述 对于一个长度为 n 的 01 串 Sx1x2x3...xnS x_{1} x_{2} x_{3} ... x_{n}Sx1x2x3...xn,香农信息熵的定义为 H(S)−∑1np(xi)log2(p(xi))H(S ) − {\textstyl…...
【Leetcode】消失的数字 [C语言实现]
👻内容专栏:《Leetcode刷题专栏》 🐨本文概括: 面试17.04.消失的数字 🐼本文作者:花 碟 🐸发布时间:2023.4.10 目录 思想1:先排序再查找 思想2:异或运算 代…...
SpringBoot接口 - 如何实现接口限流之单实例
在以SpringBoot开发Restful接口时,当流量超过服务极限能力时,系统可能会出现卡死、崩溃的情况,所以就有了降级和限流。在接口层如何做限流呢? 本文主要回顾限流的知识点,并实践单实例限流的一种思路。 SpringBoot接口 …...
【花雕学AI】深度挖掘ChatGPT角色扮演的一个案例—CHARACTER play : 莎士比亚
CHARACTER play : 莎士比亚 : 52岁,男性,剧作家,诗人,喜欢文学,戏剧,爱情 : 1、问他为什么写《罗密欧与朱丽叶》 AI: 你好,我是莎士比亚,一位英国的剧作家和诗人。我很高兴你对我的…...
腾讯云物联网开发平台 LoRaWAN 透传接入 更新版
前言 之前有一篇文章介绍LoRaWAN透传数据,不过还是用物模型云端数据解析脚本,不是真正的透传。腾讯云物联网开发平台也支持对LoRaWAN原始数据的透传、转发。今天来介绍下。腾讯云 IoT Explorer 是腾讯云主推的一站式物联网开发平台,IoT 小能手…...
4.6--计算机网络之TCP篇之TCP的基本认识--(复习+深入)---好好沉淀,加油呀
1.TCP 头格式有哪些? 序列号: 在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。 用来解决网络包乱序问题。 确认应答号: …...
一文吃透Elasticsearch
本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~ Github地址 如果访问不了Github,…...
CPU占用率高怎么办?正确解决方法在这里!
案例:CPU占用率高怎么解决 【各位朋友,我的电脑现在运行太慢了,同事说可能是CPU占用率太高了,但对本电脑小白来说,完全不知道怎么处理,大家有什么好的方法可以解决这个问题吗?】 在计算机中&a…...
ChatGPT实现用C语言写一个学生成绩管理系统
随着ChatGPT爆火,大家都在使用ChatGPT来帮助自己提高效率,对于程序员来说使用它来写代码怎么样呢?今天尝试让ChatGPT,写了一个学生成绩管理系统。 问题是:使用C语言写一个学生成绩管理系统,要求使用链表&a…...
Swagger文档注释
本文以DRF框架为例使用 为什么要接口文档注释 一. 方便后端调试与后续接口更新; 二. 对于大型前后端分离项目,前后端人员是分开开发的,甚至前端的人你都不知道远在何处,这时候接口文档的重要性就太重要了。 三. 接口注释文档常用…...
pdf怎么转换ppt格式,两个方法转换
PDF作为一种常用的文件格式,被大众所熟悉。虽然PDF具备的稳定性,安全性,以及很强的兼容性可以让我们更方便顺畅的阅读PDF文件,但若是有需要展示PDF文件内容的时候,其优点就没有那么凸显了,这时还是将pdf转换…...
深度学习编译器相关的优秀论文合集-附下载地址
公司排名不分先后 目前在AI芯片编译器领域,有很多大公司在进行研究和开发。以下是一些主要的公司和它们在该领域的研究时间: 英伟达(NVIDIA):英伟达是一家全球知名的图形处理器制造商,其在AI芯片编译器领域…...
vue全局使用svg
1、安装依赖 npm install svg-sprite-loader2、配置选项 在vue.config.js的chainWebpack里配置下面代码 解释:config.module.rule是一个方法,用来获取某个对象的规则。.exclude.add(文件a)是往禁用组添加文件a,就是对文…...
每天一点C++——杂记
结构体的深拷贝和浅拷贝 浅拷贝就是只拷贝指针,并不拷贝指针所指向的内容,深拷贝则会对指针的内容进行拷贝。浅拷贝会在一些场景下出现问题,看下面的例子: struct s {char * name;int age; };如果我定义 一个对象s1,…...
Document Imaging SDK 11.6 for .NET Crack
Document Imaging SDK for .NET View, Convert, Annotate, Process,Edit, Scan, OCR, Print 基本上被认为是一种导出 PDF 解决方案,能够为用户和开发人员提供完整且创新的 PDF 文档处理属性。它具有提供简单集成的能力,可用于增强用户 .NET 的文档成像程…...
数据挖掘(3.1)--频繁项集挖掘方法
目录 1.Apriori算法 Apriori性质 伪代码 apriori算法 apriori-gen(Lk-1)【候选集产生】 has_infrequent_subset(c,Lx-1)【判断候选集元素】 例题 求频繁项集: 对于频繁项集L{B,C,E},可以得到哪些关联规则: 2.FP-growth算法 FP-tre…...
2023年信息安全推荐证书
随着网络安全行业的不断升温,相关的认证数量也不断增加,对于在网络安全行业发展的人才来说,提升职业竞争力最有效的办法之一,就是取得权威认证。 那么如何从繁多的适合网络安全从业者的证书中选择含金量高、发展潜力大的证书&…...
基于ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、土地、土壤、农业、大气等领域应用
【自选】 时间地点:2023年7月22日-28日【乌鲁木齐】时间地点:2023年8月12日-18日【福建泉州】 【六天实践教学、提供全部资料】 专题一、空间数据获取与制图 1.1 软件安装与应用讲解 1.2 空间数据介绍 1.3海量空间数据下载 1.4 ArcGIS软件快速入门…...
基于ZC序列的帧同步
Zadoff-Chu序列是一种特殊的序列,具有良好的自相关性和很低的互相关性,这种性能可以被用来产生同步信号,作为对时间和频率的相关运算在TD-LTE系统中,Zadoff-Chu(ZC)序列主要应用于上行RS序列生成、PRACH前导序列生成以及主同步信号…...
配置NFS服务器-debian
NFS(Network Files System)是网络文件系统的英文缩写,由Sun公司于1980年开发,用于在UNIX操作系统间实现磁盘文件共享。在Linux操作系统出现后,NFS被Linux继承,并成为文件服务的一种标准。 通过网络,NFS可以在不同文件…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
