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

目录

平方差

 更小的数

买瓜

网络稳定性(货车运输)

货车运输


        

        

平方差

这道题就是数论的题,不难想到一个数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;
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《由浅入深学习SAP财务》:第2章 总账模块 - 2.7 总账模块报表 -2.7.1 对外报表:资产负债表及利润表

总账模块报表既包括对外报告的资产负债表、损益表、现金流量表&#xff0c;也包括企业自身用于查询和分析的各类报表&#xff0c;如科目余额表等。 2.7.1 对外报表&#xff1a;资产负债表及利润表 在SAP中&#xff0c;出具资产负债表和利润表的标准方法是先在后台建立一套“会…

大模型化身数据魔法师,降低NLP高置信误判

关注公众号【AI论文解读】回复: 论文解读 获取本文论文 引言&#xff1a;NLP模型的高置信错误与脆弱性问题 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;模型的预测性能优化往往伴随着高置信错误&#xff08;high confidence errors&#xff09;的产生&#x…

【MATLAB源码-第49期】基于蚁群算法(ACO)算法的栅格路径规划,输出最佳路径图和算法收敛曲线图。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 蚁群算法是一种模拟自然界蚂蚁觅食行为的启发式优化算法。在蚁群系统中&#xff0c;通过模拟蚂蚁之间通过信息素沟通的方式来寻找最短路径。 在栅格路径规划中&#xff0c;蚁群算法的基本步骤如下&#xff1a; 1. 初始化: …

LeetCode-热题100:104. 二叉树的最大深度

题目描述 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a; root [3,9,20,null,null,15,7] 输出&#xff1a; 3 示例 2&#xff1a; 输入&#xff1a; root …

直驱式风电机组的发电机和双馈风电机组的发电机发电机generator的区别

直驱式风电机组的发电机和双馈风电机组的发电机在结构和工作原理上有明显的区别&#xff1a; 直驱式风电机组的发电机&#xff1a; 结构简单&#xff0c;通常由永磁同步发电机构成。直接将风轮的转动与发电机的转子连接&#xff0c;无需传动系统。没有齿轮箱&#xff0c;因此减…

GPT图解:大模型是怎样构建的,书籍PDF分享

今天又来给大家推荐一本大模型方面的书籍<GPT图解:大模型是怎样构建的>本书将以生动活泼的笔触&#xff0c;将枯燥的技术细节化作轻松幽默的故事和缤纷多彩的图画&#xff0c;引领读者穿梭于不同技术的时空&#xff0c;见证自然语言处理技术的传承、演进与蜕变。 在这本…

求存款本息和(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h> # include <math.h>int main() {//初始化变量值&#xff1b;double P 1000, r1 0.015, r2 0.021, r3 0.0275, r4 0.03, r5 0.0035;int judge 0;//…

【C语言】——字符串函数的使用与模拟实现(上)

【C语言】——字符串函数 前言一、 s t r l e n strlen strlen 函数1.1、函数功能1.2、函数的使用1.3、函数的模拟实现&#xff08;1&#xff09;计数法&#xff08;2&#xff09;递归法&#xff08;3&#xff09;指针 - 指针 二、 s t r c p y strcpy strcpy 函数2.1、函数功能…

Go语言开发工具Vscode配置

Go语言开发工具Vscode配置方法分享&#xff1a; 1.下载安装vscode https://code.visualstudio.com/ 2.汉化vscode 3.vscode中安装Go语言插件 源自&#xff1a;大地老师Golang语言beego入门实战视频教程下载地址

5、LMDeploy 量化部署 LLMVLM实战(homework)

基础作业&#xff08;结营必做&#xff09; 完成以下任务&#xff0c;并将实现过程记录截图&#xff1a; 配置lmdeploy运行环境 由于环境依赖项存在torch&#xff0c;下载过程可能比较缓慢。InternStudio上提供了快速创建conda环境的方法。打开命令行终端&#xff0c;创建一…

项目实现:Boost搜索引擎

一.项目背景 当前已经有许多上市公司做了搜索引擎&#xff0c;比如说百度&#xff0c;搜狗&#xff0c;360等等&#xff0c;这些项目都是很大的项目&#xff0c;有很高的技术门槛&#xff0c;我们自己实现一个完整的搜索引擎是不可能的&#xff0c;但是我们可以写一个简单的搜…

【ARM 裸机】硬件平台简介

硬件平台采用的是正点原子的 I.MX6ULL-MINI 开发板&#xff0c;分为底板和核心板&#xff1b; 1、底板 正点原子 Mini 开发板的外形尺寸为 100mm*130mm&#xff0c;I.MX6U-Mini 开发板底板板载资源如下&#xff1a; ◆ 1 个核心板接口&#xff0c;支持 I.MX6ULL 核心板。 ◆ 1…

梯度提升树(Gradient Boosting Trees)

通过5个条件判定一件事情是否会发生&#xff0c;5个条件对这件事情是否发生的影响力不同&#xff0c;计算每个条件对这件事情发生的影响力多大&#xff0c;写一个梯度提升树&#xff08;Gradient Boosting Trees&#xff09;模型程序,最后打印5个条件分别的影响力。 示例一 梯…

RobotFramework功能自动化测试框架基础篇

概念 RobotFramework是什么&#xff1f; Robot Framework是一款python编写的功能自动化测试框架。具备良好的可扩展性&#xff0c;支持关键字驱动&#xff0c;可以同时测试多种类型的客户端或者接口&#xff0c;可以进行分布式测试执行。主要用于轮次很多的验收测试和验收测试…

力扣练习题(2024/4/14)

1接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,2…

基于 net/http 抽象出 go 服务优雅停止的一般思路

和其他语言相比&#xff0c;Go 中有相同也有不同&#xff0c;相同的是实现思路上和其他语言没啥差异&#xff0c;不同在于 Go 采用的是 goroutine channel 的并发模型&#xff0c;与传统的进程线程相比&#xff0c;实现细节上存在差异。 本文将从实际场景和它的一般实现方式展…

蓝桥杯物联网竞赛_STM32L071KBU6_全部工程及国赛省赛真题及代码

包含stm32L071kbu6全部实验工程、源码、原理图、官方提供参考代码及国、省赛真题及代码 链接&#xff1a;https://pan.baidu.com/s/1pXnsMHE0t4RLCeluFhFpAg?pwdq497 提取码&#xff1a;q497

3D室内装潢设计 Sweet Home 3D for Mac 中文直装版

Sweet Home 3D 是一款非常棒的家装辅助设计软件&#xff0c;支持包括中文在内的16中语言&#xff0c;它能帮您通过二维的家居平面图来设计和布置您的家具,还可以用三维的视角浏览整个装修布局的全貌。是一款操作起来简单方便&#xff0c;使用起来快捷、迅速&#xff0c;拥有超高…

在Mac主机上连接Linux虚拟机

前言 最近醉心于研究Linux&#xff0c;于是在PD上安装了一个Debian Linux虚拟机&#xff0c;用来练练手。但是每次在mac和Linux之间切换很是麻烦&#xff0c;有没有一种方法&#xff0c;可以在mac终端直接连接我的虚拟机&#xff0c;这样在mac终端上就可以直接操控我的Linux虚…

Redis之路系列(1)千里之行始于足下

01 千里之行始于足下 文章内容基于redis6 安装与运行 无论你一名极客还是一名工程师&#xff0c;Redis安装我都推荐源码安装&#xff0c;请前往官方下载地址&#xff1a;http://redis.io/download 进行源码下载&#xff0c;偶数为稳定版 奇数为不稳定版。 如果你是类linux系统…