第十四届蓝桥杯题解:平方差 ,更小的数,买瓜,网络稳定性(货车运输)

目录

平方差

 更小的数

买瓜

网络稳定性(货车运输)

货车运输


        

        

平方差

这道题就是数论的题,不难想到一个数m可以拆成(a-b)(a+b),其实(a-b)和(a+b)就是m的一对因子,不妨设为x和y。

则有:

a+b=x;

a-b=y;

x*y=m;

联立求解:a=(x+y)/2,b=(x-y)/2;

也就是对于一个数m,只要存在一对因数x,y就必然存在一对a,b,又因为a和b必须为整数。

所以x+y和x-y必须为偶数。

不难发现

偶数+偶数=偶数,偶数-偶数=偶数

奇数+奇数=奇数,奇数-奇数=奇数

得出x+y和x-y必须同时为偶数或者奇数。

也就是m必须存在一对同时为偶数或者为奇数的因数 

那么这句话等价于m是4的倍数,或者是一个奇数

#include <bits/stdc++.h>
using namespace std;
int main(){int ans=0,l,r;cin>>l>>r;for(int i=l;i<=r;i++){if(i%4==0||i%2!=0)ans++;}cout<<ans;
}

        

        

 更小的数

很明显,要在O(n^2)内完成本题,但是判断每种方案是否满足又是一件头疼的事情,只能在O(n)内完成。

 
那么可以定义dp[i][j]表示从i下标到j下标的方案是否合法,主要就是为了快速求dp[i][j]

当我们在判断dp[i][j]是否合法时,完全可以借助之前的结果

 
如果字符s[i]>s[j]  则dp[i][j]=1(合法)
如果s[i]==s[j] 则dp[i][j]=dp[i+1][j-1](里面的字符串是合法的则外面的也合法,否之不合法)

#include <bits/stdc++.h>
using namespace std;
int ans,n;
bool f[5005][5005];
string s;
int main(){cin>>s;n=s.size();for(int k=2;k<=n;k++)for(int i=0;i+k<=n;i++){int j=i+k-1;if(s[i]>s[j])f[i][j]=1,ans++;else if(s[i]==s[j])ans+=f[i+1][j-1],f[i][j]=f[i+1][j-1];}cout<<ans;return 0;
}

        

        

买瓜

这个题就是考察优化,3^30次方一定是满分不了的,如果想拿满分一定要优化。

首先是拿瓜:如果已经拿多了就放弃此方案

后面的瓜就算全拿也不够也放弃此方案

找到当前最优的刀数后只要比此更大的刀数一律放弃

然后就是数组倒序来加速找到答案。

总之一道非常好的dfs优化题

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
long long m,suf[35];
int n,ans,a[35];
void dfs(int x,int y, ll z){if(z==m){ans=min(ans,y);return ;}if((suf[x]+z<m)||y>=ans||x>n||z>m)return ;//3个主优化:找到最佳答案后抛弃当下答案,后面的数全部加起来也不行就放弃,数组倒序dfs(x+1,y+1,z+a[x]/2);//拿到瓜过多了就放弃,遍历完就返回。基本提高好几个数量级的速度dfs(x+1,y,z+a[x]);dfs(x+1,y,z);
}
int main(){cin>>n>>m;ans=60;m*=2;for(int i=1;i<=n;i++)cin>>a[i],a[i]*=2;sort(a+1,a+1+n);reverse(a+1,a+1+n);for(int i=n;i>=1;i--)suf[i]=suf[i+1]+a[i];//排序后再写缀合数组dfs(1,0,0);if(ans==60)cout<<-1;else cout<<ans;return 0;
}

        

        

网络稳定性(货车运输)

这个题是一道照抄过来的题,原题是“货车运输” 

就是这个题:

货车运输

一模一样,就拿这道做过的题来说把:

题意是要路径上最小的权值链路最大,如果是单源问题还是可以dijkstra的。

但是这个题是多源问题,就要kruskal+lca。

首先解释一下为什么要用kruskal:

那么不妨假设求u到v的路径,我们要所有由u通往v的路径中最小边权中最大的路径,那么如果我们按照最大生成树去建图,是不是图中任意两点间建立的路径都是最大路径?因为那些更小的边我们都没用上。可以设想一下如果u到v还有别的额外的路径,那么这些路径之所有没有没用上,不就是因为有的边权太小了。

然后是lca:

我们在建完树后,为什么就会想到lca呢?

首先这个时候我们要求两个点的路径,其实已经变得唯一了,而且必须找到最近公共祖先,所以需要用到lca

其次我们要求u到v的最小边权,那么这个最小边权如果一个一个的跑不就又变成n^n了吗,怎么办?这时候可以想到离线求极值的方法:倍增,线段树。

说到树上倍增,你最快的是不是想到lca

所以我们可以设置w[i][j]表示从i开始向上走2^j到长度对应的小的权值。然后从i开始走2^j长度路径上的最小权值。

同样设置:f[i][j]表示从i开始向上走2^j到的节点

这样就可以在逼近的时候一遍使用w来更新答案,一边使用f找公共祖先

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10,M=3e5+5,inf=1e9;
int tot,n,m,q,head[N],deep[N],f[N][21],w[N][21],fa[N];
//f[i][j]表示从i开始向上走2^j到的节点,w[i][j]表示从i开始向上走2^j到长度对应的小的权值
bool vis[N];
struct edge1{int u,v,w;}e1[M];
struct edge2{int v,w,next;}e2[N];
int find(int x){if(x!=fa[x])fa[x]=find(fa[x]);return fa[x];
}
void add(int u,int v,int w){e2[++tot]=(edge2){v,w,head[u]};head[u]=tot;}
bool cmp(edge1 a,edge1 b){return a.w>b.w;}
void kruskal(){for(int i=1;i<=n;i++) fa[i]=i;//初始化并查集sort(e1+1,e1+1+m,cmp);//建立最大生成树for(int i=1;i<=m;i++){ int u=e1[i].u,v=e1[i].v,w=e1[i].w;int f1=find(u),f2=find(v);if(f1!=f2){ //建立重构树fa[f1]=f2;//合并并查集add(u,v,w);add(v,u,w);}}
}
void dfs(int u,int faa){//初始化每个点的deep[v],f[v][0],w[v][0]vis[u]=1;for(int i=head[u];i;i=e2[i].next){int v=e2[i].v;if(v==faa)continue;deep[v]=deep[u]+1;f[v][0]=u;w[v][0]=e2[i].w;dfs(v,u);//先更新自己再更新孩子}
}
int lca(int x,int y){if(find(x)!=find(y))return -1;int ans=inf;if(deep[x]>deep[y])swap(x,y);//让左边y向右边x靠近for(int i=20;i>=0;i--){//达到相同深度if(deep[f[y][i]]>=deep[x]){ans=min(ans,w[y][i]); y=f[y][i];//每上升一次就要更新此距离上的最小值。修改y位置}}if(x==y)return ans;//第一次返回for(int i=20;i>=0;i--){//一起上升到没有公共祖先为止if(f[x][i]!=f[y][i]){ans=min(ans,min(w[x][i],w[y][i]));//每上升一次就要更新两段距离上的最小值。x=f[x][i];y=f[y][i];}}ans=min(ans,min(w[x][0],w[y][0]));//此时再往上一格就是lca,所以再更新一次return ans;
}
int main(){cin>>n>>m>>q;for(int i=1;i<=m;i++){cin>>e1[i].u>>e1[i].v>>e1[i].w;}kruskal();for(int i=1;i<=n;i++){if(vis[i])continue;deep[i]=1;dfs(i,0);f[i][0]=i;w[i][0]=inf;//初始化根的信息}for(int i=1;i<=20;i++){//初始化倍增表for(int j=1;j<=n;j++){f[j][i]=f[f[j][i-1]][i-1];//距离倍增表w[j][i]=min(w[j][i-1],w[f[j][i-1]][i-1]);//极值倍增表}}int x,y;for(int i=1;i<=q;i++){cin>>x>>y;cout<<lca(x,y)<<'\n';}return 0;}

当然如果你只是骗分,那么直接floyd就可以。

设置dp[i][j]表示i到j路径上的存在的最小边权,

根据: dp[i][j]=max(dp[i][j],min(dp[i][k],dp[k][j]))进行转移

当然前提是i能到k,k能到j 。然后至少能拿小半分了。

 memset(dp,-1,sizeof(dp));cin>>n>>m>>q;while(m--){int u,v,x;cin>>u>>v>>x;dp[u][v]=max(dp[u][v],x);   //如果有重边,选稳定性最大的一条路dp[v][u]=max(dp[v][u],x);}for(int k=1;k<=n;k++){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(i!=j&&j!=k&&i!=k){   //用K中转的路径 更新dp[i][j]dp[i][j]=max(dp[i][j],min(dp[i][k],dp[k][j]));}}}}while(q--){int x,y;cin>>x>>y;cout<<dp[x][y]<<endl;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/817113.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM—jps、jstat、jinfo、jmap、jstack的使用

JVM—jps、jstat、jinfo、jmap、jstack的使用 jps jps全称&#xff1a;Java Virtual Machine Process Status Tool 可以查看Java进程&#xff0c;相当于Linux下的ps命令&#xff0c;只不过它只列出Java进程。 jps:列出Jav程序ID和Main函数名称 jps -q:只输出进程ID jps -m …

MATLAB4:数值计算

文章目录 一、实验目的二、实验内容三、仿真结果四、实践中遇到的问题及解决方法 一、实验目的 1. 熟悉根据已知数据进行回归法曲线拟合。   2. 熟悉根据已知数据进行多项式曲线拟合。   3. 熟悉根据已知数据利用指定方法进行数据插值&#xff08;临近插值、线性插值、立方…

小程序视频如何下载到电脑上

小程序视频如何下载到电脑上&#xff0c;很简单 1.利用Fiddler和Charles这些专业的抓包工具 2.利用录屏 3.利用专门抓取资源的工具(集成了抓取下载&#xff0c;而且对资源下载很友好) 工具我已经打包好了 下载高手链接&#xff1a;https://pan.baidu.com/s/1qJ81sNBzzzU0w…

Linux的学习之路:6、Linux编译器-gcc/g++使用

摘要 本文主要是说一些gcc的使用&#xff0c;g和gcc使用一样就没有特殊讲述。 目录 摘要 一、背景知识 二、gcc如何完成 1、预处理(进行宏替换) 2、编译&#xff08;生成汇编&#xff09; 3、汇编&#xff08;生成机器可识别代码 4、链接&#xff08;生成可执行文件或…

【我的代码生成器】生成React页面类

有了数据表的结构信息&#xff0c;就能生成React 的页面类&#xff0c;快捷方便。 生成界面如下&#xff1a; 生成的React FrmUser.js页面如下&#xff1a; 只需再写里面的操作逻辑代码。

银河麒麟之PaddleOCR模型部署

一、PaddleOCR简介 PaddleOCR是一个基于飞桨框架开发的开源OCR工具&#xff0c;提供了一系列强大的文本识别功能。PaddleOCR支持多种文本识别任务&#xff0c;包括文字检测、文字识别、文本方向检测等。它具有高效、准确的特点&#xff0c;适用于多种场景下的文本识别需求&…

IDP之Backstage - 环境搭建

0. 目录 1. 前言2. 环境准备&#xff08;Windows10下&#xff09;2.1 安装nvm2.2 git和docker安装 3. 创建模板项目3.1 典型错误: fails on the yarn install step3.2 再次启动3.3 验证 4. 相关 1. 前言 本不想写这篇&#xff0c;因为看着官网文档写着挺简单的&#xff0c;但实…

线上剧本杀小程序发展趋势如何?

随着几年的快速发展&#xff0c;剧本杀行业进入到了大众的视野&#xff0c;不过从2022年开始&#xff0c;行业就开始处于下滑趋势&#xff0c;但是行业反而变得更加的规范化。 经历过下滑发展后&#xff0c;剧本杀行业已经趋向专业化、精品化发展&#xff0c;行业正在复苏&…

高基报表是什么?高校各部门如何快速填报高基表?

高基报表——全称是《高等教育事业基层统计报表》&#xff08;以下简称《高基报表》&#xff09;&#xff0c;作为高等院校基本情况报表的代表&#xff0c;承载着学校办学实力的真实写照。填报高基报表是一项细致入微的工作&#xff0c;不仅关系到学校的科学管理和决策研究&…

第一节:什么是操作系统

什么是操作系统 一、一台计算机的组成部分1、计算机能干啥2、谈谈计算机硬件 二、什么是操作系统三、学习操作系统的层次 一、一台计算机的组成部分 如下图所示&#xff1a; 这就是就是构成一台计算机的组成部分 1、计算机能干啥 ∙ \bullet ∙计算机是我们专业吃饭的家伙&a…

前端知识学习笔记-六(vue)

简介 Vue是前端优秀框架是一套用于构建用户界面的渐进式框架 Vue优点 Vue是目前前端最火的框架之一 Vue是目前企业技术栈中要求的知识点 vue可以提升开发体验 Vue学习难度较低 Vue开发前准备 一、nodejs环境 Nodejs简介 Nodejs诞生于2009年&#xff0c;主攻服务器方向&#x…

数据结构OJ题——栈和队列

1. 用栈实现队列&#xff08;OJ链接&#xff09; 题目描述&#xff1a;请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09; void push(int x) 将元素 x 推到队列的末尾 int pop() 从队列的开头移除并返回…

锂电池寿命预测 | Matlab基于BiLSTM双向长短期记忆神经网络的锂电池寿命预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 锂电池寿命预测 | Matlab基于BiLSTM双向长短期记忆神经网络的锂电池寿命预测 程序设计 完整程序和数据获取方式&#xff1a;私信博主回复Matlab基于BiLSTM双向长短期记忆神经网络的锂电池寿命预测。 参考资料 [1] h…

Python数据分析案例42——基于Attention-BiGRU的时间序列数据预测

承接上一篇的学术缝合&#xff0c;排列组合模型&#xff0c;本次继续缝合模型演示。 Python数据分析案例41——基于CNN-BiLSTM的沪深300收盘价预测-CSDN博客 案例背景 虽然我自己基于各种循环神经网络做时间序列的预测已经做烂了.....但是还是会有很多刚读研究生或者是别的领…

最新版守约者二级域名分发系统

主要功能 二级域名管理&#xff1a; 我们的系统提供全面的二级域名管理服务&#xff0c;让您轻松管理和配置二级域名。 域名分发&#xff1a;利用我们先进的域名分发技术&#xff0c;您可以自动化地分配和管理域名&#xff0c;确保每个用户或客户都能及时获得所需的域名资源。…

SpringBoot基于RabbitMQ实现消息延迟队列方案

知识小科普 在此之前&#xff0c;简单说明下基于RabbitMQ实现延时队列的相关知识及说明下延时队列的使用场景。 延时队列使用场景 在很多的业务场景中&#xff0c;延时队列可以实现很多功能&#xff0c;此类业务中&#xff0c;一般上是非实时的&#xff0c;需要延迟处理的&a…

【深入探讨】JavaScript 中的 forEach 和 map 区别

&#x1f431; 个人主页&#xff1a;不叫猫先生&#xff0c;公众号&#xff1a;前端Clodplay &#x1f64b;‍♂️ 作者简介&#xff1a;前端领域优质作者、阿里云专家博主&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; ✨优质专栏&#xff1a;VS Code插件开…

房贷还款(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h> # include <math.h>int main() {//初始化变量值&#xff1b;double m, r 0.01;float d 300000;float p 6000;//运算还款所需月份&#xff1b;m log10…

元象4.2B参数 MoE大模型实战

01 简介 近期&#xff0c;元象公司推出了其首个Moe大模型XVERSE-MoE-A4.2B。该模型采用了混合专家模型架构&#xff08;Mixture of Experts&#xff09;&#xff0c;并拥有4.2B的激活参数&#xff0c;其性能可与13B模型相媲美。值得一提的是&#xff0c;这个模型是完全开源的&…

Python 实战人工智能数学基础:图像处理应用

1.背景介绍 在许多计算机视觉任务中&#xff0c;图像处理占据了很重要的角色&#xff0c;尤其是在目标检测、特征提取、分类、跟踪等计算机视觉任务中。图像处理是一个复杂的过程&#xff0c;涉及到图像的采集、分析、存储、显示等环节。本文将讨论基于Python实现的图像处理的…