蓝桥杯真题31日冲刺国一 | 每日题解报告 第五天

大家好,我是泡泡,给大家带来今天的题解

目录

一、猴子分香蕉

二、等差数列

三、平方序列

四、倍数问题


一、猴子分香蕉

题目链接:猴子分香蕉 - 蓝桥云课 (lanqiao.cn)

题目要求:

5 只猴子是好朋友,在海边的椰子树上睡着了。这期间,有商船把一大堆香蕉忘记在沙滩上离去。

第 1 只猴子醒来,把香蕉均分成 5 堆,还剩下 1 个,就吃掉并把自己的一份藏起来继续睡觉。

第 2 只猴子醒来,把香蕉均分成 5 堆,还剩下 2 个,就吃掉并把自己的一份藏起来继续睡觉。

第 3 只猴子醒来,把香蕉均分成 5 堆,还剩下 3 个,就吃掉并把自己的一份藏起来继续睡觉。

第 4 只猴子醒来,把香蕉均分成 5 堆,还剩下 4 个,就吃掉并把自己的一份藏起来继续睡觉。

第 5 猴子醒来,重新把香蕉均分成 5 堆,哈哈,正好不剩!

请计算一开始最少有多少个香蕉。

解题思路:

按照题意暴力模拟即可,注意 每次藏一份根据剩下的来藏 而不是藏一个,踩过坑。

#include<bits/stdc++.h> 
using namespace std;
int main()
{
	int a = 6;
	while(1)
	{
		if(a%5==1)
		{
			int i = a-(a-1)/5;
			i -= 1; 
			if(i%5==2)
			{
				int i2 = i-(i-2)/5;
				i2=i2-2;
				if(i2%5==3)
				{
					int i3=i2-(i2-3)/5;
					i3=i3-3;
					if(i3%5==4)
					{
						int i4=i3-(i3-4)/5;
						i4=i4-4;
						if(i4%5==0&&i4!=0)
						{
							cout<<a;
							return 0;
						} 
					}
				}
			}
		} 
		a++;
	}
}

二、等差数列

题目链接:等差数列 - 蓝桥云课 (lanqiao.cn)

题目要求:

数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一 部分的数列,只记得其中 N 个整数。

现在给出这 N 个整数,小明想知道包含这 N 个整数的最短的等差数列有几项?

解题思路:

很简单的一道题,先排序找出最小的差,它就是等差数列的差,要注意判断一下是否为0,看代码!

#include<bits/stdc++.h>
using namespace std;
//就是对它先排序找出最小的差,那就是等差数列差,
//要注意的一点就是要判断一下它的差是不是0,如果是0的话最小就是n个。
int a[100001];
int main()
{
	int n;
	cin>>n;
	int x = INT_MAX;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	}
	sort(a,a+n);
	for(int i=1;i<n;i++)
	{
        x = min(a[i]-a[i-1],x);//找到最小的差 就是等差数列的差 
    }
    if(!x)
	{
		cout<<n;//如果差是0 最小就是n个 
	}
    else
	{
        int	sum = (a[n-1]-a[0])/x+1;//如果不是0 那就让最大的数-最小的数并且除以该差+1 
        cout<<sum;
    }
    return 0;
}

三、平方序列

题目链接:平方序列 - 蓝桥云课 (lanqiao.cn)

题目要求:

小明想找到两个正整数 X 和 Y,满足

  1. 2019 < X < Y
  2. 2019^2, X^2, Y^2 组成等差数列。

请你求出在所有可能的解中,X + Y 的最小值是多少?

解题思路:

这个也是暴力题,按照题意模拟即可。

#include<bits/stdc++.h>
using namespace std;
int main()
{
	for(int i=2020;i<10001;i++)
	{
		int x = i*i*2-2019*2019;
		int y = sqrt(x);
		if(y*y==x)
		{
			cout<<i+y;
			return 0;
		}
	}
}

四、倍数问题

题目链接:倍数问题 - 蓝桥云课 (lanqiao.cn)

题目要求:

众所周知,小葱同学擅长计算,尤其擅长计算一个数是否是另外一个数的倍数。但小葱只擅长两个数的情况,当有很多个数之后就会比较苦恼。现在小葱给了你 n 个数,希望你从这 n 个数中找到三个数,使得这三个数的和是 K 的倍数,且这个和最大。数据保证一定有解。

解题思路:

可以用二维数组加双层循环遍历和剪枝AC,直接看代码吧,我在代码里模拟两边 写了注释 大家理解一下自己代入值体验一下代码怎么跑的就懂了。

#include<bits/stdc++.h>
using namespace std;
int f[1003][3];
long long maxx,a,b,c;
int main()
{
	int n,k;4 3
    cin>>n>>k;
    for(int i=0;i<n;i++)
    {
        int x;
        cin>>x;//1 2 3 4
        int m = x%k;//1除3的余数1 2%3=2 3%3 = 0 4%3 = 1
        if(x>f[m][0])//1大于f[1][0] 2大于f[2][0] 3大于f[3][0] 4大于f[1][0] 
        {
            f[m][2] = f[m][1];//维护 更新最大 第二大 第三大的值 
            f[m][1] = f[m][0];
            f[m][0] = x;
            //f[1][0] = 1 f[2][0] = 2 f[0][0] = 3 f[1][0]从1变4 
        }
        else if(x>f[m][1]) 
        {
            f[m][2] = f[m][1];
            f[m][1] = x;
        }
        else if(x>f[m][2])
        {
            f[m][2] = x;
        }
    }
    for(int i=0;i<k;i++)//按照余数枚举第一组
    {
        for(int j=0;j<k;j++)//按照余数枚举第二组
        {//a + b + c%k = (a%k + b%k + c%k) %k
        //所以知道前两个就能得出来第三个的余数 第三个值为k-a%k+k-b%k  
        //如果觉得难理解可以看看 a+b+c=d 求第三个数就是 d-a-b=c 
            int kk = (k-i+k-j)%k;//得到第三个余数这三个余数凑为k的倍数 第二次得到为2 
            a = f[i][0]; //f[0][0]是0 f[0][0]还是0 
            if(i==j)//0=0 0!=1 
            {
                b = f[i][1];//f[0][1]也是0 
                if(i==kk)//现在的kk是2 不相等 
				{
					c = f[i][2];
				}
                else
				{
					c = f[kk][0];//c = f[2][0](2) 
				}
            }
            else
            {
                b = f[j][0];//b = f[1][0] = 4
                if(i==kk)//0!=2
				{
					c = f[i][1];
				}
                else if(j==kk)//1!=2
				{
					c = f[j][1];
				}
                else//c = f[2][0] = 2
                {
                	c = f[kk][0];
				}
            }
            if(a+b+c>maxx)//0+0+2大于maxx 0+4+2大于2 maxx = 6 
			{
				maxx = a+b+c;
			}
        }
    }
    cout<<maxx;
    return 0;
}

觉得对你有帮助可以给我点个关注加三连支持,感谢各位。

  • 14
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cloud、泡泡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值