算法刷题day46

目录

  • 引言
  • 一、树的重心
  • 二、毕业旅行问题
  • 三、高精度乘法

引言

今天复习了一下高精度的所有模板,包括加法、减法、乘法、除法,因为自己当时在蓝桥杯的时候没有看出来那个题使用高精度,因为对于一个数的大小和一个数的长度,自己有时候搞不清楚概念,所以当时没看出来,一个数就算是 l o n g   l o n g long\ long long long 也只有 18 、 19 18、19 1819 那么长,所以得记住这个概念。然后就是树形 D P DP DP 和状压 D P DP DP 了,做了已经很多遍了,已经慢慢的理解了其深层含义,所以还是要先多做题然后才能明白其内涵,以后打算把基础课的题全部刷一遍,好好巩固基础,加油!


一、树的重心

标签:dfs、树形DP

思路:思路就是求每一个结点去除后的最大值,然后在这些最大值里取最小值,如下图所示。这里的 d f s ( u ) dfs(u) dfs(u) 求得是 u u u 结点的向下的结点个数,我们可以先找到其每个分支的数量,因为删去该结点后,每个分支就是一个连通块,然后向上的一块,也是一个连通块,所以思路就是先对每一个向下的分支的连通块找最小值,然后同时求和,然后用总的结点数一减就是向上的连通块中的结点数,然后再对其求最小值,又因为这是一个递归过程,整个过程是从下往上解决的。然后为什么要建双向边,是因为不知道谁是谁的父节点,也不知道谁是根结点,同时判重,这样就可以只按照一个方向去递归了。

在这里插入图片描述

题目描述:

给定一颗树,树中包含 n 个结点(编号 1∼n)和 n−1 条无向边。

请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。

重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。

输入格式
第一行包含整数 n,表示树的结点数。

接下来 n−1 行,每行包含两个整数 a 和 b,表示点 a 和点 b 之间存在一条边。

输出格式
输出一个整数 m,表示将重心删除后,剩余各个连通块中点数的最大值。

数据范围
1≤n≤105
输入样例
9
1 2
1 7
1 4
2 8
2 5
4 3
3 9
4 6
输出样例:
4

示例代码:

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
typedef pair<int,int> PII;
#define x first
#define y second

const int N = 1e5+10, M = N * 2, INF = 0x3f3f3f3f;

int n, m;
int h[N], e[M], ne[M], idx;
bool st[N];
int ans = 2e9;

void add(int a, int b)
{
	e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}

int dfs(int u)  // 找到包括u在内的分支数的和
{
	st[u] = true;  // 防止往回递归
	
	int sum = 1, size = 0;
	for(int i = h[u]; i != -1; i = ne[i])
	{
		int j = e[i];
		if(st[j]) continue;
		
		int t = dfs(j);
		sum += t;
		size = max(size, t);
	}
	
	size = max(size, n - sum);
	ans = min(ans, size);
	return sum;
}

int main()
{
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	
	memset(h, -1, sizeof h);
	cin >> n;
	for(int i = 0; i < n - 1; ++i)
	{
		int a, b; cin >> a >> b;
		add(a,b), add(b,a);  // 因为不知道谁是谁的父节点,也不知道谁是根
	}
	
	dfs(1);
	cout << ans << endl;
	
	return 0;
}

二、毕业旅行问题

标签:状态压缩DP

思路:就是定义一个状态 f [ i ] [ j ] f[i][j] f[i][j] 代表从已经走过 i i i 个城市,走过的城市编号为其二进制的 1 1 1 的位数,我们从 0 0 0 开始,最终到达 j j j 号城市的一个集合,那么状态转移方程为先经过 k k k 号城市,然后再到达 j j j 号城市,直接按顺序枚举即可。然后初始状态就是只经过 0 0 0 号城市,并且最终在该城市,花费为 0 0 0 ,即 f [ 1 ] [ 0 ] = 0 f[1][0] = 0 f[1][0]=0 ,然后只需要判断是否经过 j , k j,k j,k 等城市即可。

题目描述:

小明目前在做一份毕业旅行的规划。

打算从北京出发,分别去若干个城市,然后再回到北京,每个城市之间均乘坐高铁,且每个城市只去一次。

由于经费有限,小明希望能够通过合理的路线安排尽可能的省些路上的花销。

给定一组城市和每对城市之间的火车票的价钱,找到每个城市只访问一次并返回起点的最小车费花销。

注意:北京为 1 号城市。

输入格式
第一行包含一个正整数 n,表示城市个数。

接下来输入一个 n 行 n 列的矩阵,表示城市间的车票价钱。

输出格式
输出一个整数,表示最小车费花销。

数据范围
1<n≤20,包括北京车票价格均不超过 1000 元。

输入样例:
4
0 2 6 5
2 0 4 4
6 4 0 2
5 4 2 0
输出样例:
13
说明
共 4 个城市,城市 1 和城市 1 的车费为 0,城市 1 和城市 2 之间的车费为 2,城市 1 和城市 3 之间的车费为 6,城市 1
 和城市 4 之
 间的车费为 5,以此类推。

假设任意两个城市之间均有单程票可买,且价格均在 1000 元以内,无需考虑极端情况。

示例代码:

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
typedef pair<int,int> PII;
#define x first
#define y second

const int N = 20, M = 1 << N;

int n, m;
int w[N][N];
int f[M][N];

int main()
{
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	
	cin >> n;
	for(int i = 0; i < n; ++i)
	{
		for(int j = 0; j < n; ++j)
		{
			cin >> w[i][j];
		}
	}
	
	memset(f, 0x3f, sizeof f);
	f[1][0] = 0;
	for(int i = 1; i < M; i += 2)
	{
		for(int j = 0; j < n; ++j)
		{
			if(i >> j & 1)
			{
				for(int k = 0; k < n; ++k)
				{
					if(i >> k & 1)
					{
						f[i][j] = min(f[i][j], f[i-(1<<j)][k] + w[k][j]);
					}
				}
			}
		}
	}
	
	int res = 2e9;
	for(int i = 0; i < n; ++i)
	{
		res = min(res, f[(1<<n)-1][i] + w[i][0]);
	}
	cout << res << endl;
	
	return 0;
}

三、高精度乘法

标签:高精度、模板题

思路:模板题没什么说的,值得注意的是,这个加法和乘法都涉及到进位,所以这个 A A A 遍历完了,有时最后刚好进位了,所以也要等 t t t 0 0 0 了才行,得判断一下。

题目描述:

给定两个非负整数(不含前导 0) A 和 B,请你计算 A×B 的值。

输入格式
共两行,第一行包含整数 A,第二行包含整数 B。

输出格式
共一行,包含 A×B 的值。

数据范围
1≤A的长度≤100000,0≤B≤10000
输入样例:
2
3
输出样例:
6

示例代码:

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
typedef pair<int,int> PII;
#define x first
#define y second

const int N = 1e5+10;

int n, m;

vector<int> mul(vector<int>& a, int b)
{
	vector<int> res;
	
	int t = 0;
	for(int i = 0; i < a.size() || t; ++i)
	{
		if(i < a.size()) t += b * a[i];
		res.push_back(t % 10);
		t /= 10;
	}
	
	while(res.size() > 1 && res.back() == 0) res.pop_back();
	return res;
}

int main()
{
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	
	string a; int b;
	cin >> a >> b;
	
	vector<int> A;
	for(int i = a.size() - 1; i >= 0; --i) A.push_back(a[i] - '0');
	
	auto res = mul(A,b);
	for(int i = res.size() - 1; i >= 0; --i) cout << res[i];
	cout << endl;
	
	return 0;
}

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

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

相关文章

关于卡尔曼滤波进行状态预测的方法

卡尔曼滤波是一种有效的线性动态系统状态估计方法。它通过递归地处理测量数据&#xff0c;结合系统动力学模型和测量模型&#xff0c;来预测和估计系统的状态。卡尔曼滤波特别适用于系统状态在时间上演化&#xff0c;而且测量数据存在噪声的情况。以下是卡尔曼滤波对于状态预测…

编译器的学习

常用的编译器&#xff1a; GCCVisual CClang&#xff08;LLVM&#xff09;&#xff1a; Clang 可以被看作是建立在 LLVM 之上的一个项目, 实际上LLVM是clang的后端&#xff0c;clang作为前端前端生成LLVM IR&#xff0c;https://zhuanlan.zhihu.com/p/656699711MSVC &#xff…

[C++][算法基础]能被整除的数(容斥原理)

给定一个整数 &#x1d45b; 和 &#x1d45a; 个不同的质数 &#x1d45d;1,&#x1d45d;2,…,&#x1d45d;&#x1d45a;。 请你求出 1∼&#x1d45b; 中能被 &#x1d45d;1,&#x1d45d;2,…,&#x1d45d;&#x1d45a; 中的至少一个数整除的整数有多少个。 输入格式…

【Java Spring MVC项目异常解决】HTTP 500

HTTP 500状态码表示“内部服务器错误”&#xff08;Internal Server Error&#xff09;。这是一个通用的错误响应&#xff0c;表明服务器在处理请求时遇到了预料之外的情况&#xff0c;导致无法完成请求。500错误是服务器端错误的一种&#xff0c;与客户端无关。在Web开发中&am…

初识《list》及手搓模拟《list》

目录 前言&#xff1a; 1. list的介绍及使用 list的介绍&#xff1a; list的使用&#xff1a; 1、list的构造​编辑 2、list iterator的使用 3、list capacity 4、list element access 5、list modifiers 2.list的模拟实现 1、关于迭代器&#xff1a; 2、迭代器类的…

代码质量与可维护性的重要性都有哪些?

目录 一、为了提高代码质量&#xff0c;可以采取以下几种方法&#xff1a; 二、如何制定和执行有效的代码编写规范&#xff1f; 三、设计模式和设计原则在提高代码质量中的具体应用案例有哪些&#xff1f; 四、代码审查的最佳实践和技巧是什么&#xff1f; 五、如何有效地…

CV每日论文--2024.4.24

1、Guess The Unseen: Dynamic 3D Scene Reconstruction from Partial 2D Glimpses 中文标题&#xff1a;猜测未见之景&#xff1a;从部分二维片段进行动态三维场景重建 简介&#xff1a;这篇论文提出了一种方法&#xff0c;可以从单目视频输入中重建世界和多个动态人物的3D模…

猫主食罐要怎么挑?注意这些含胶的罐头!

我曾与专业的宠物医生深入交流&#xff0c;得知猫罐头的种类与选择不可一概而论。主食罐头营养搭配精细&#xff0c;旨在全面满足猫咪健康需求&#xff0c;常添加矿物质和维生素&#xff0c;并针对不同猫咪有特定配方。而零食罐头更重口感与美味&#xff0c;钠含量高&#xff0…

如何提取单片机片内程序的值进行拷贝?

对于许多单片机&#xff0c;其固件是由制造商保护的&#xff0c;并且未经授权的访问、拷贝或修改可能侵犯法律。我这里有一套嵌入式入门教程&#xff0c;不仅包含了详细的视频 讲解&#xff0c;项目实战。如果你渴望学习嵌入式&#xff0c;不妨点个关注&#xff0c;给个评论222…

跨部门协作中的沟通困境与平台建设策略——以软硬件研发为例

一、背景 在科技行业&#xff0c;跨部门合作的重要性不言而喻&#xff0c;然而实际工作中&#xff0c;经常会遭遇沟通不畅的现象。以软件与硬件研发部门为例&#xff0c;两者在产品研发过程中经常需要紧密协作&#xff0c;但却时常出现信息传递障碍。当你试图阐述观点时&#…

LangSmith帮助测试大模型系统

LangSmith是评估大模型能力好坏的评估工具,能够量化评估基于大模型的系统的效果。LangSmith通过记录langchain构建的大模型应用的中间过程,从而能够更好的调整提示词等中间过程做优化。想要使用LangSmith首先进入他的设置页面,https://smith.langchain.com/settings注册一个…

多商家AI智能名片商城系统(开源版)——构建高效数字化商业新生态

一、项目概述 1、项目背景 1&#xff09;起源 随着数字化时代的快速发展&#xff0c;传统名片和商城系统已经难以满足企业日益增长的需求。商家需要更高效、更智能的方式来展示自己的产品和服务&#xff0c;与消费者进行互动和交易。同时&#xff0c;开源技术的普及也为开发…

安卓玩机工具推荐----MTK芯片 简单制作线刷包 备份分区 备份基带 去除锁类 推荐工具操作解析

工具说明 在前面几期mtk芯片类玩机工具中解析过如何无官方固件从手机抽包 制作线刷包的步骤&#xff0c;类似的工具与操作有很多种。演示的只是本人片面的理解与一些步骤解析。mtk芯片机型抽包关键点在于..mt*****txt的分区地址段引导和 perloader临时分区引导。前面几期都是需…

在控制台实现贪吃蛇

在控制台实现贪吃蛇 前备知识Win32APICOORD这个结构体的声明如下&#xff1a;GetStdHandle 函数GetConsoleCursorInfo 函数SetConsoleCursorInfo 函数 SetConsoleCursorPosition 函数getAsyncKeyState 函数 控制台窗口的大小以及字符打印介绍控制台中的坐标宽字符及本地化介绍s…

多线程情况下IBMMQ报文丢失原因分析

背景 最近工作中&#xff0c;使用IBMMQ&#xff0c;重启服务时有偶发性的报文丢失情况&#xff0c;应用从队列中获取到了消息&#xff0c;但是线程停止没有处理。 分析 消息处理线程流程&#xff1a; 判断线程状态是否可用&#xff0c;如果不可用直接返回。使用MQQueue.get…

Seurat -- Introduction to scRNA-seq integration 跟随学习记录

文章目录 数据是如何转换的原始ifnb数据对象Splits object后的数据对象数据对象构建完成后的标准流程Normalization后的数据对象scale 后的数据对象 不同的样本进行整合JoinLayers干了什么 数据是如何转换的 seurat object 中assays R N A l a y e r s RNAlayers RNAlayersco…

卡尔曼滤波器(一):卡尔曼滤波器简介

观看MATLAB技术讲座笔记&#xff0c;该技术讲座视频来自bilibili账号&#xff1a;MATLAB中国。 一、什么是卡尔曼滤波器 卡尔曼滤波器是一种优化估计算法&#xff0c;是一种设计最优状态观测器的方法&#xff0c;其功能为&#xff1a; 估算只能被间接测量的变量&#xff1b;通…

​漏电继电器JHOK-ZBLφ150mm 0.03-3A 0.2-2S导轨安装JOSEF约瑟

系列型号&#xff1a; JHOK-ZBL多档切换式漏电&#xff08;剩余&#xff09;继电器&#xff08;导轨&#xff09; JHOK-ZBL1多档切换式漏电&#xff08;剩余&#xff09;继电器 JHOK-ZBL2多档切换式漏电&#xff08;剩余&#xff09;继电器 JHOK-ZBM多档切换式漏电&#xff08;…

深入理解分布式事务① ---->分布式事务基础(四大特性、五大类型、本地事务、MySQL并发事务问题、MySQL事务隔离级别命令设置)详解

目录 深入理解分布式事务① ---->分布式事务基础&#xff08;四大特性、五大类型、本地事务、MySQL并发事务问题、MySQL事务隔离级别命令设置&#xff09;详解事务的基本概念1、什么是事务&#xff1f;2、事务的四大特性2-1&#xff1a;原子性&#xff08;Atomic&#xff09…

STM32点灯大师(中断法)

一、使用CubeMX配置 新增加了RCC进行配置 二、代码 需要重写虚函数&#xff0c;给自己引用