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

大家好,我是泡泡,今天是蓝桥杯真题第三天,给大家带来详细的题解

 

目录

一、年龄巧合

二、纸牌三角形

三、取球游戏

总结


一、年龄巧合

题目链接: 年龄巧合 - 蓝桥云课 (lanqiao.cn)

题目要求:

小明和他的表弟一起去看电影,有人问他们的年龄。小明说:今年是我们的幸运年啊。我出生年份的四位数字加起来刚好是我的年龄。表弟的也是如此。已知今年是 2014年,并且,小明说的年龄指的是周岁。

请推断并填写出小明的出生年份。

解题思路:

一个暴力水题,让年份每个数字相加并且加上当前年份减去年份相加的岁数等于2014,那就是正确年龄,取离2014最近的两个就是表弟和小明的年龄,咱们的代码只输出小明的年龄。

​
#include<bits/stdc++.h>
using namespace std;
int pd(int x)//年份每个数字相加
{
	int z = 0;
	while(x)
	{
		z+=x%10;
		x/=10;
	}
	return z; 
}
int main()
{
	int n=2014,sum=0,max=2014,min=0;
	for(int i=2013;i>0;i--)//从2013开始
	{
		if(i+pd(i)==n&&i<max)//如果年龄加年份等于2014并且当前年份小于上一个年份(因为小明比弟弟大,所以出生年份一定比弟弟小)
		{
			max = i;//让当前年份等于max
			min++;//计算是第几次的年龄,如果是第二次就可以跳出循环了,这就是小明的年龄
			if(min==2)
			{
				break;
			}
		}
	}	
	cout<<max;
	return 0;
}

​

二、纸牌三角形

题目链接:纸牌三角形 - 蓝桥云课 (lanqiao.cn)

题目要求:

A,2,3,4,5,6,7,8,9 共 9张纸牌排成一个正三角形(A 按 1 计算)。要求每个边的和相等。 下图就是一种排法。

这样的排法可能会有很多。

如果考虑旋转、镜像后相同的算同一种,一共有多少种不同的排法呢?

请你计算并提交该数字。

解题思路:

一个简单的dfs全排列,如果不懂得可以去搜一下全排列学习一下,使用函数固然方便但是手敲全排列可以巩固记忆。 

#include<bits/stdc++.h>
using namespace std;
int sum,arr[10],pd[10];//一个纸牌数组,一个用来判断的数组
void dfs(int x)
{
	if(x>9)//如果搜索的数字已经超过9个
	{
        int a1 = arr[1] + arr[2] + arr[3] + arr[4];
        int a2 = arr[4] + arr[5] + arr[6] + arr[7];
        int a3 = arr[7] + arr[8] + arr[9] + arr[1];		
		if(a1==a2&&a1==a3)//让三条边相加 判断第一条边和第二条 第一条和第三条
		{
			sum++;//如果他们相等 三角形成立 ++
		}
        return;//返回
	}
    for(int i=1;i<=9;i++)//如果没超过九个
    {
    	if(pd[i]==0)//进入循环之后如果当前数字没有用过
    	{
    		pd[i] = 1;//标记用过
    		arr[x] = i;//选择它
    		dfs(x+1);//搜索下一个数字
    		pd[i] = 0;//回溯
    		arr[x] = 0;
		}
	}
}
int main()
{
    dfs(1);
    cout<<sum/6;//除6是因为旋转重复三次 镜像重复两次 2*3等于6
    return 0;
}

三、取球游戏

题目链接:取球游戏 - 蓝桥云课 (lanqiao.cn)

题目要求:

今盒子里有 nn 个小球,A、B 两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下多少个,并且两人都很聪明,不会做出错误的判断。

我们约定:

每个人从盒子中取出的球的数目必须是:1,3,7 或者 8 个。轮到某一方取球时不能弃权!A 先取球,然后双方交替取球,直到取完。被迫拿到最后一个球的一方为负方(输方)

请编程确定出在双方都不判断失误的情况下,对于特定的初始球数,A 是否能赢?

解题思路:

这是一个入门的博弈论,非常简单,如果只有一个球的时候,A必输,而当球数是1+1,1+3,1+7,1+8 时 A可分别取1,3,7,8,使得后手输,所以就很简单了,记录一下这些数字即可

#include<bits/stdc++.h>
using namespace std;
int a[101],b[10001];
int main()
{
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	}
	for(int i=1;i<10001;i++)
	{
		if(b[i]==0)
		{
			b[i+1]=1;//标记一下这几个数字为1,和前几天的简单哈希有点像
			b[i+3]=1;
			b[i+7]=1;
			b[i+8]=1;
		}
	}//开大点 肯定博弈不了那么多
	for(int i=0;i<n;i++)
	{
		cout<<b[a[i]]<<endl;//输出a[i]上对应的数字,那就是游戏输赢
	}
	return 0;
}

总结

今天的三道题不算很难,但是也需要熟练掌握!加油!为了国一!

  • 16
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

cloud、泡泡

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

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

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

打赏作者

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

抵扣说明:

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

余额充值