第五周学习总结

第五周学习总结,第1张

本周由于各种原因,看题目看博客时间大大减少了,导致了本周看的内容偏少,周六周天也尽力在弥补本周欠下的学习内容。

本周同样还是看的相关搜索的内容,话不多说,在此总结一下本周所看所学到的东西。

P3884 [JLOI2009]二叉树问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

#include
using namespace std;
struct node{
	int father;  //爸爸
	int left;    //左儿子
	int right;   //右儿子
	int deep;    //深度
	int data;    //记录节点走过没
}a[10001];
int sum[101];
int lca(int x,int y){      //最最重要!!!求最近公共祖先
	a[x].data=1;           //把x的节点记录已走过
	while(a[x].father!=0){ //遍历至根节点
		x=a[x].father;     //更新遍历爸爸
		a[x].data=1;       //记录已走过
	}
	while(a[y].data!=1){   //遍历至x节点已走过的节点,找到最近公共祖先
		y=a[y].father;
	}
	return y;
}
int main(){
	int n,x,y,s,t,maxx=1;
	cin>>n;
	a[1].deep=1;    //根节点的深度为1
	a[1].father=0;  //根节点没有爸爸
	for(int i=1;i>x>>y;
		if(a[x].left==0)    //这个节点是否有左儿子
		   a[x].left=y;     //变成左儿子
		else                //变成右儿子
		   a[x].right=y;
		a[y].father=x;
		a[y].deep=a[x].deep+1;   //更新深度
		if(a[y].deep>maxx)       //求出最大深度,第一个问题完成
		   maxx=a[y].deep;
	}
	cin>>s>>t;
	int f=lca(s,t),num=0,num1=0;
	while(s!=f){                //记录s到最近公共祖先有多少条边
		s=a[s].father;
		num++;
	}
	num*=2;   //结点间距离的定义:由结点向根方向(上行方向)时的边数×2,
	while(t!=f){               //记录t到最近公共祖先有多少条边
		t=a[t].father;
		num1++;
	}
	for(int i=1;i<=n;i++)      //把每一个深度有多少个节点记录
	    sum[a[i].deep]++;
	sort(sum+1,sum+1+100);
	cout<

在此搜索题目里,用到了二叉树的知识。

利用二叉树的性质进行了搜索。

现在对二叉树的相关知识还不太清楚。

通过这个题目,简单了解了一下二叉树的知识,但是太浅薄,还需继续阅读相关资料。

P1118 [USACO06FEB]Backward Digit Sums G/S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

#include 
using namespace std;
int n,p;
int a[13];
int c[13][13];
bool b[13];//判重
void dfs(int dep,int s)
{
	if(s>p)//如果现在累加的数已经超过了给定的数,就返回
		return;
	if(dep>n)//如果已经搜完了n个数,就返回
	{
		if(s==p)//如果答案跟给定的数相等
		{
			cout<>n>>p;//输入
	c[1][1]=1;
	for(int i=2;i<=n;i++)
		for(int j=1;j<=i;j++)
			c[i][j]=c[i-1][j]+c[i-1][j-1];//生成杨辉三角
	dfs(1,0);
	return 0;
}

要想理解这个题,必须要知道杨辉三角的知识,杨辉三角的递推式:yhsj[i][j] = yhsj[i-1][j-1] + yhsj[i][j-1]。

连通块问题:一个矩阵选其中的一个元素,在它的周围进行判断,若它的周围连通,再进行对周围判断,直到不再连通。

连通的这一片为一个连通块,通常题目判断连通块的个数,此类题目比较基本。

举一个AC的例子:P1451 求细胞数量 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题意:要找到细胞块,当一个细胞块被 0包围的时候,这个就算是一个细胞块。

细胞块只能是上下左右被包围 ,斜着的是无用的。

同时,使用 dfs 的时候,注意判断使用的边界。

ac代码:

#include 

using namespace std;
int n,m,s=0;
char a[100][100];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
void dfs(int x,int y)
{

    for(int i=0;i<4;i++)
   {
    int xx=x+dx[i];
    int yy=y+dy[i];
    if(xx>=0&&yy>=0&&xx<=n&&yy<=m&&a[xx][yy]!=0)
        { a[xx][yy]=0;
        dfs(xx,yy); }
   }
}
int main()
{
    cin>>n>>m;
    for(int i=0;i>temp;
        a[i][j]=temp-48;
        }
    for(int i=0;i

在做这个题目的时候,遇到了一个问题,看它题目输入的时候都是整型,开始就定义了整型数组,写完代码觉得很对,但是按照输入样例输入,调试好多次都不对。

又返回回去看题目,说是字符型,又改成了字符型数组,调试还不对。

过了一会,想到字符和数字之间需要转换,改了一下输入,进行调试就正确了。

做完之后,思考了一下为啥整型不行,因为输入的时候两个数之间没有分开,导致一排数都存到了一个元素里。

对于这些本周所看所学写一下感悟,上周看的大部分题目较为简单,基本上都是搜索题目中基本的问题(有相应的模板和套路)。

本周所看的题目难度增大,对于题目的理解变得十分吃力,没有清晰的解题思路,导致看的题目很少。

而且上周基本上都是以看为主,本周一些题目代码都是自己慢慢打出来的,进行了一下实践。

 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/674871.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-19
下一篇 2022-04-19

发表评论

登录后才能评论

评论列表(0条)