IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 蓝桥杯刷题 -> 正文阅读

[数据结构与算法]蓝桥杯刷题

题目一:货物摆放
在这里插入图片描述
现在设这个立方体的长宽高为a,b,c,即必须满足abc=n,有这个式子可得,啊a,b,c都是的因子,因此这道题可以转化为找到n的因子,在n的因子中如果三个因子相乘为n,则符合要求,现在考虑如何找到这个数的因子,刚开始考虑的时候,是将小于n的数遍历一遍,如果相除的余数为0,则是该数的因子,如果数小可以采用,但是如果数像这道题中这么大,计算机跑起来会花费很多时间,因此我们可以考虑求到根号n,也就是说如果i是n的因子,则n/i也是n的因子
所以大致思路就是,定义一个变量i,在i*i<=n时开始遍历,寻找对应的因子,定义一个数组来存放找到的因子,如果n%i=0,则i是n的因子,存放到数组中,同是如果n/i!=i,则n/i也是n的因子,也将其存放到数组当中,因为根据题目来讲,将三个因子来回颠倒顺序是不同的方案,因此将数组中的元素遍历,只要三个元素相乘等于n即可,用计数器计算个数就可以啦

#include <iostream>
using namespace std;
int main()
{
  long long arr[1000];//定义数组存放因子
  // 请在此输入您的代码
  long long n=2021041820210418;
  int length=0;
  long long i=1;
  for(i=1;i*i<=n;i++)
  {
    if(n%i==0)
    {
      arr[length]=i;
      length++;
      if(n/i!=i)//要考虑两个元素相同的情况
      {
        arr[length]=n/i;
        length++;
      }
    }
    

  }
  long long x,y,z;
  long long count=0;
  for(x=0;x<length;x++)
  {
    for(y=0;y<length;y++)
    {
    	if(arr[x]*arr[y]>n)
    	continue;
      for(z=0;z<length;z++)
      {
        if(arr[x]*arr[y]*arr[z]==n)
        {
          count++;
        }
      }
    }
  }
  cout<<count<<endl;

  return 0;
}

总结:
有相乘问题的话要考虑找到该数的因子,但是不能都是暴力地遍历,要考虑如果i是因子,则n/i也是,所以遍历到根号n即可呀
在考虑存放n/i这个因子的时候,要考虑n/i是不是等于i的情况,否则可能因子多出一个
题目二:路径问题
在这里插入图片描述
这道题就是一个求最短路径的问题,可以采用多种算法,我这里用的是比较暴力的Floyd算法,就是定义一个二维数组来存储路径长度,引入一个中间值k,进行比较来确定这个最短路径,这里我就不再详细介绍算法的思路了,主要说一下总结出来的问题

#include <iostream>
using namespace std;
const int MAX=3000;
const long long INF = 1e18;
long long arr[MAX][MAX];

void Floyd(int n)
{
	for(int k=1;k<=n;k++)
	{
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			{
				if(arr[i][j]>arr[i][k]+arr[k][j])
				{
					arr[i][j]=arr[i][k]+arr[k][j];
				}
			}
		}
	}
}

int number(int x,int y)//找最大公约数 
{
	int i=x;
	if(x>y)
	i=y;
	while(i)
	{
		if((x%i==0)&&(y%i==0))
		{
			return i;
		}
		i--;
	}
}

int abs(int x,int y)//计算绝对值
{
	if(x>=y)
	return x-y;
	else
	return y-x;
}
int main()
{
	int n=2021;
	for(int i=1;i<=n;i++)//将数组初始化
	{
		for(int j=1;j<=n;j++)
		{
			if(i==j)
			{
				arr[i][j]=0;
			}
			else if(abs(i,j)<=21)
			{
				arr[i][j]=arr[j][i]=i*j/number(i,j);
			}
			else
			{
				arr[i][j]=INF;
			}
		}
	}
	Floyd(n);
	cout<<arr[1][2021]<<endl;
	return 0;
}

求最小公倍数即两数相乘再除以最大公约数
结果附上:
在这里插入图片描述
题目三:蛇形填数
在这里插入图片描述
对于这种题目,如果数值比较小,就可以考虑直接用手动列举的方法,但是如果数据较大,就不可采用
对于这种问题,要考虑找规律,在填写的时候,会有斜着向上和斜着向下两种填法,而数据是依次递增的,所以我们可以类比计数器来记录数据,然后只考虑行和列的变化就可以了,当然,也要必须考虑边界问题,即第一行和第一列的数据
设r来表示行数,s来表示列数,我们就可以考虑行数的变化规律
(1)r=1时:
c为奇数:下一步将走到(r,c+1)
c为偶数:下一步将走到(r+1,c-1)
(2)c=1时
r为奇数:下一步将走到(r-1,c+1)
r为偶数:下一步将走到(r+1,c)
(3)接下来就要考虑其他数据了,因为每次写的时候是斜着的,所以这斜着的一行行数+列数的奇偶性是相同的,因此可以根据行数和列数相加的奇偶性来判断下一步的走向
r+c为奇数时:下一步将走到(r+1,c-1)
r+c为偶数时:下一步将走到(r-1,c+1)
由此经过循环就可以求出其对应数字啦

#include <iostream>
using namespace std;

int main()
{
	int r=1;int c=1;
	int n=1;
	while(r!=20||c!=20)
	{
		if(r==1)
		{
			if(c%2==0)
			{
				r++;
				c--;
			}
			else
			{
				c++;
			}
		}
		else if(c==1)
		{
			if(r%2==0)
			{
				r++;
			}
			else
			{
				r--;
				c++;
			}
		}
		else if((r+c)%2==0)
       {
       	r--;
       	c++;
	   }
	   else
	   {
	   	r++;
	   	c--;
	   }
	   n++;
	}
	cout<<n<<endl;
	return 0;
}

锵锵锵!放上结果来
在这里插入图片描述
总结:对于复杂的数据问题,要考虑找其中的规律,再二位数组中或者矩阵里,更要考虑找行和列的规律,当然,要着重考虑特殊情况,即行和列为1的情况
在这里插入图片描述

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-06 16:19:17  更:2022-04-06 16:20:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:02:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码