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

第十四届蓝桥杯大赛软件赛省赛-试题 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 串中 000111 出现的占比。比如,对于 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。对于一个长度为 233333332333333323333333010101 串,如果其信息熵为 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+mnp(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; // 减少 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 串的熵 解题思路+完整代码

欢迎访问个人网站来查看此文章&#xff1a;http://www.ghost-him.com/posts/db23c395/ 问题描述 对于一个长度为 n 的 01 串 Sx1x2x3...xnS x_{1} x_{2} x_{3} ... x_{n}Sx1​x2​x3​...xn​&#xff0c;香农信息熵的定义为 H(S)−∑1np(xi)log2(p(xi))H(S ) − {\textstyl…...

【Leetcode】消失的数字 [C语言实现]

&#x1f47b;内容专栏&#xff1a;《Leetcode刷题专栏》 &#x1f428;本文概括&#xff1a; 面试17.04.消失的数字 &#x1f43c;本文作者&#xff1a;花 碟 &#x1f438;发布时间&#xff1a;2023.4.10 目录 思想1&#xff1a;先排序再查找 思想2&#xff1a;异或运算 代…...

SpringBoot接口 - 如何实现接口限流之单实例

在以SpringBoot开发Restful接口时&#xff0c;当流量超过服务极限能力时&#xff0c;系统可能会出现卡死、崩溃的情况&#xff0c;所以就有了降级和限流。在接口层如何做限流呢&#xff1f; 本文主要回顾限流的知识点&#xff0c;并实践单实例限流的一种思路。 SpringBoot接口 …...

【花雕学AI】深度挖掘ChatGPT角色扮演的一个案例—CHARACTER play : 莎士比亚

CHARACTER play : 莎士比亚 : 52岁&#xff0c;男性&#xff0c;剧作家&#xff0c;诗人&#xff0c;喜欢文学&#xff0c;戏剧&#xff0c;爱情 : 1、问他为什么写《罗密欧与朱丽叶》 AI: 你好&#xff0c;我是莎士比亚&#xff0c;一位英国的剧作家和诗人。我很高兴你对我的…...

腾讯云物联网开发平台 LoRaWAN 透传接入 更新版

前言 之前有一篇文章介绍LoRaWAN透传数据&#xff0c;不过还是用物模型云端数据解析脚本&#xff0c;不是真正的透传。腾讯云物联网开发平台也支持对LoRaWAN原始数据的透传、转发。今天来介绍下。腾讯云 IoT Explorer 是腾讯云主推的一站式物联网开发平台&#xff0c;IoT 小能手…...

4.6--计算机网络之TCP篇之TCP的基本认识--(复习+深入)---好好沉淀,加油呀

1.TCP 头格式有哪些&#xff1f; 序列号&#xff1a; 在建立连接时由计算机生成的随机数作为其初始值&#xff0c;通过 SYN 包传给接收端主机&#xff0c;每发送一次数据&#xff0c;就「累加」一次该「数据字节数」的大小。 用来解决网络包乱序问题。 确认应答号&#xff1a; …...

一文吃透Elasticsearch

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址 如果访问不了Github&#xff0c…...

CPU占用率高怎么办?正确解决方法在这里!

案例&#xff1a;CPU占用率高怎么解决 【各位朋友&#xff0c;我的电脑现在运行太慢了&#xff0c;同事说可能是CPU占用率太高了&#xff0c;但对本电脑小白来说&#xff0c;完全不知道怎么处理&#xff0c;大家有什么好的方法可以解决这个问题吗&#xff1f;】 在计算机中&a…...

ChatGPT实现用C语言写一个学生成绩管理系统

随着ChatGPT爆火&#xff0c;大家都在使用ChatGPT来帮助自己提高效率&#xff0c;对于程序员来说使用它来写代码怎么样呢&#xff1f;今天尝试让ChatGPT&#xff0c;写了一个学生成绩管理系统。 问题是&#xff1a;使用C语言写一个学生成绩管理系统&#xff0c;要求使用链表&a…...

Swagger文档注释

本文以DRF框架为例使用 为什么要接口文档注释 一. 方便后端调试与后续接口更新&#xff1b; 二. 对于大型前后端分离项目&#xff0c;前后端人员是分开开发的&#xff0c;甚至前端的人你都不知道远在何处&#xff0c;这时候接口文档的重要性就太重要了。 三. 接口注释文档常用…...

pdf怎么转换ppt格式,两个方法转换

PDF作为一种常用的文件格式&#xff0c;被大众所熟悉。虽然PDF具备的稳定性&#xff0c;安全性&#xff0c;以及很强的兼容性可以让我们更方便顺畅的阅读PDF文件&#xff0c;但若是有需要展示PDF文件内容的时候&#xff0c;其优点就没有那么凸显了&#xff0c;这时还是将pdf转换…...

深度学习编译器相关的优秀论文合集-附下载地址

公司排名不分先后 目前在AI芯片编译器领域&#xff0c;有很多大公司在进行研究和开发。以下是一些主要的公司和它们在该领域的研究时间&#xff1a; 英伟达&#xff08;NVIDIA&#xff09;&#xff1a;英伟达是一家全球知名的图形处理器制造商&#xff0c;其在AI芯片编译器领域…...

vue全局使用svg

1、安装依赖 npm install svg-sprite-loader2、配置选项 在vue.config.js的chainWebpack里配置下面代码 解释&#xff1a;config.module.rule是一个方法&#xff0c;用来获取某个对象的规则。.exclude.add&#xff08;文件a&#xff09;是往禁用组添加文件a&#xff0c;就是对文…...

每天一点C++——杂记

结构体的深拷贝和浅拷贝 浅拷贝就是只拷贝指针&#xff0c;并不拷贝指针所指向的内容&#xff0c;深拷贝则会对指针的内容进行拷贝。浅拷贝会在一些场景下出现问题&#xff0c;看下面的例子&#xff1a; struct s {char * name;int age; };如果我定义 一个对象s1&#xff0c;…...

Document Imaging SDK 11.6 for .NET Crack

Document Imaging SDK for .NET View, Convert, Annotate, Process,Edit, Scan, OCR, Print 基本上被认为是一种导出 PDF 解决方案&#xff0c;能够为用户和开发人员提供完整且创新的 PDF 文档处理属性。它具有提供简单集成的能力&#xff0c;可用于增强用户 .NET 的文档成像程…...

数据挖掘(3.1)--频繁项集挖掘方法

目录 1.Apriori算法 Apriori性质 伪代码 apriori算法 apriori-gen(Lk-1)【候选集产生】 has_infrequent_subset(c,Lx-1)【判断候选集元素】 例题 求频繁项集&#xff1a; 对于频繁项集L{B,C,E}&#xff0c;可以得到哪些关联规则&#xff1a; 2.FP-growth算法 FP-tre…...

2023年信息安全推荐证书

随着网络安全行业的不断升温&#xff0c;相关的认证数量也不断增加&#xff0c;对于在网络安全行业发展的人才来说&#xff0c;提升职业竞争力最有效的办法之一&#xff0c;就是取得权威认证。 那么如何从繁多的适合网络安全从业者的证书中选择含金量高、发展潜力大的证书&…...

基于ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、土地、土壤、农业、大气等领域应用

【自选】 时间地点&#xff1a;2023年7月22日-28日【乌鲁木齐】时间地点&#xff1a;2023年8月12日-18日【福建泉州】 【六天实践教学、提供全部资料】 专题一、空间数据获取与制图 1.1 软件安装与应用讲解 1.2 空间数据介绍 1.3海量空间数据下载 1.4 ArcGIS软件快速入门…...

基于ZC序列的帧同步

Zadoff-Chu序列是一种特殊的序列&#xff0c;具有良好的自相关性和很低的互相关性&#xff0c;这种性能可以被用来产生同步信号&#xff0c;作为对时间和频率的相关运算在TD-LTE系统中&#xff0c;Zadoff-Chu(ZC)序列主要应用于上行RS序列生成、PRACH前导序列生成以及主同步信号…...

配置NFS服务器-debian

NFS(Network Files System)是网络文件系统的英文缩写&#xff0c;由Sun公司于1980年开发&#xff0c;用于在UNIX操作系统间实现磁盘文件共享。在Linux操作系统出现后&#xff0c;NFS被Linux继承&#xff0c;并成为文件服务的一种标准。 通过网络&#xff0c;NFS可以在不同文件…...

免费开源乐谱识别神器Audiveris:三步将纸质乐谱转为数字格式

免费开源乐谱识别神器Audiveris&#xff1a;三步将纸质乐谱转为数字格式 【免费下载链接】audiveris Latest generation of Audiveris OMR engine 项目地址: https://gitcode.com/gh_mirrors/au/audiveris 你是否曾面对一叠纸质乐谱&#xff0c;渴望将它们转换成可编辑的…...

暗黑破坏神2存档修改器:释放你的游戏创造力

暗黑破坏神2存档修改器&#xff1a;释放你的游戏创造力 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit 你是否曾想过&#xff0c;如果能让暗黑破坏神2中的角色拥有完美的装备组合&#xff1f;如果…...

一键永久保存:B站缓存视频转换终极方案,让珍贵内容不再消失

一键永久保存&#xff1a;B站缓存视频转换终极方案&#xff0c;让珍贵内容不再消失 【免费下载链接】m4s-converter 一个跨平台小工具&#xff0c;将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾有过…...

终极Visual C++运行库修复指南:如何一次性解决所有DLL缺失问题

终极Visual C运行库修复指南&#xff1a;如何一次性解决所有DLL缺失问题 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾因"找不到MSVCP140.dll&qu…...

蓝桥杯嵌入式省赛串口通信实战:用STM32G431RBT6和CubeMX搞定数据收发与LCD显示

蓝桥杯嵌入式省赛串口通信实战&#xff1a;STM32G431RBT6与CubeMX高效开发指南 对于备战蓝桥杯嵌入式省赛的选手而言&#xff0c;串口通信与LCD显示的联动实现往往是比赛中的关键得分点。本文将围绕STM32G431RBT6开发板&#xff0c;通过CubeMX和Keil MDK5工具链&#xff0c;深入…...

Keil C编译器字符串常量合并机制与内存优化

1. Keil C编译器中的字符串常量合并机制解析在嵌入式开发中&#xff0c;内存优化是一个永恒的话题。Keil C编译器&#xff08;包括C51、C166和C251版本&#xff09;提供了一项智能特性——自动合并重复的字符串常量。这个功能看似简单&#xff0c;但对资源受限的嵌入式系统而言…...

5步快速上手!罗技鼠标宏终极压枪教程:告别手残轻松吃鸡

5步快速上手&#xff01;罗技鼠标宏终极压枪教程&#xff1a;告别手残轻松吃鸡 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 还在为《绝地求生…...

别再死记FPN公式了!用PyTorch手把手带你画一遍特征金字塔的‘数据流图’

用PyTorch动态可视化FPN特征金字塔的数据流动 在目标检测领域&#xff0c;特征金字塔网络&#xff08;FPN&#xff09;已经成为处理多尺度目标的标配组件。但很多开发者虽然能背诵FPN的结构图&#xff0c;却对特征图在金字塔各层之间的流动变化缺乏直观感受。本文将带您用PyTor…...

别再手动配环境了!用VMware一键导入bee-box镜像,5分钟搞定bWAPP靶场

5分钟极速部署bWAPP靶场&#xff1a;VMware镜像导入全指南 对于刚踏入Web安全领域的新手来说&#xff0c;最令人头疼的往往不是漏洞原理本身&#xff0c;而是那些看似简单却暗藏玄机的环境配置。PHP版本不兼容、MySQL服务启动失败、Apache模块缺失...这些"拦路虎"消…...

告别NeRF的漫长等待:用3D Gaussian Splatting在Colab上5分钟跑通你的第一个3D场景

5分钟在Colab玩转3D高斯泼溅&#xff1a;零基础极速生成你的3D场景 当你想把几张随手拍的照片变成可自由旋转的3D场景时&#xff0c;传统方法可能需要数小时甚至更久的等待。现在&#xff0c;3D高斯泼溅&#xff08;3D Gaussian Splatting&#xff09;技术让这一切变得触手可及…...