蓝桥杯真题(3)

ae863ae64cbe4c56b71634c77b69353e.gif

 hello 😄

我是「 YR_T 」

今天继续来发蓝桥杯真题,这个专栏也已经更新到第三篇了,我目标就是刷爆249道蓝桥杯真题

这么算算我还能发50多篇呢。。。

也祝各位都能拿到省一💡

废话不多说,直接开始做题!

目录

第一题 「生日蜡烛」2016初赛🌹

分析🌹

代码🌹

第二题 「方格填数」2016初赛🌲

分析🌲

代码🌲

第三题 「寒假作业」2016初赛🌊

分析🌊

第一种代码🌊

 第二种代码🌊

第四题 「剪邮票」2016初赛🐯

分析🐯

代码🐯

 最后🍊


第一题 「生日蜡烛」2016初赛🌹

题目描述:
某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。

现在算起来,他一共吹熄了236根蜡烛。

请问,他从多少岁开始过生日party的?

请填写他开始过生日party的年龄数。 注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

分析🌹

这道题很简单,看注释就能看懂

代码🌹

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
 
int main()
{
    int i;
    for(i=1;i<236;i++)
    {
        int n = i,sum = 0;//n是记录从多大开始过生日的,sum记录共吹灭的蜡烛数
        int t = n;//保存一开始过生日时候的岁数
        while(true)
        {
            sum+=n;//记录总共吹灭的蜡烛
            n++;
            if(sum==236)
            {
                cout<<t;    return 0;
            }else if(sum>236)
                break;
        }
    }
    return 0;
}

第二题 「方格填数」2016初赛🌲

题目描述

如下的10个格子,填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)一共有多少种可能的填数方案?
 

c8db07519918a2ac37dfdab05b483a13.png

输出格式

请填写表示方案数目的整数。

分析🌲

 先给方格按顺序排个号,再用 next_permutation 函数全排列,然后把所有相邻差值为1的条件判断一遍。通俗讲就是暴力

代码🌲

#include<iostream>
#include<algorithm>
using namespace std;
int a[11]={0,1,2,3,4,5,6,7,8,9};
int judge()
{
	if(abs(a[0]-a[1])==1||abs(a[0]-a[3])==1||abs(a[0]-a[4])==1||abs(a[0]-a[5])==1)
		return 0;
	else if(abs(a[1]-a[2])==1||abs(a[1]-a[4])==1||abs(a[1]-a[5])==1||abs(a[1]-a[6])==1)
		return 0;
	else if(abs(a[2]-a[5])==1||abs(a[2]-a[6])==1)
		return 0;
	else if(abs(a[3]-a[4])==1||abs(a[3]-a[7])==1||abs(a[3]-a[8])==1)
		return 0;
	else if(abs(a[4]-a[5])==1||abs(a[4]-a[7])==1||abs(a[4]-a[8])==1||abs(a[4]-a[9])==1)
		return 0;
	else if(abs(a[5]-a[6])==1||abs(a[5]-a[8])==1||abs(a[5]-a[9])==1)
		return 0;
	else if(abs(a[6]-a[9])==1)
		return 0;
	else if(abs(a[7]-a[8])==1)
		return 0;
	else if(abs(a[8]-a[9])==1)
		return 0;
	return 1;
}
int main()
{
	int c=0;
	do
	{
		if(judge())
			c++;
	}while(next_permutation(a,a+10));
	printf("%d\n",c);
	return 0;
}

第三题 「寒假作业」2016初赛🌊

题目描述

现在小学的数学题目也不是那么好玩的。
看看这个寒假作业:

57fb209b0865e95633a590163c4a04a6.png


每个方块代表1~13中的某一个数字,但不能重复。
比如:

6  + 7 = 13
9  - 8 = 1
3  * 4 = 12
10 / 2 = 5

以及: 

7  + 6 = 13
9  - 8 = 1
3 * 4 = 12
10 / 2 = 5

就算两种解法。(加法,乘法交换律后算不同的方案)
你一共找到了多少种方案?

输出格式

请填写表示方案数目的整数。

分析🌊


这道题目是从13个数中选12个填到方框里面,是一个全排列问题。最终13个数都会填完

第一种代码🌊


第一段代码,虽然能够运行出结果,但是花费时间需要将近1分钟做填空题可以用能运行出答案就行。

#include<iostream>
using namespace std;

int a[]={1,2,3,4,5,6,7,8,9,10,11,12,13};
int ans;
bool check(){
	if(a[0]+a[1]==a[2]&&
	a[3]-a[4]==a[5]&&
	a[6]*a[7]==a[8]&&
	a[9]%a[10]==0&&
	a[9]/a[10]==a[11])
	return true;
	return false;
}
int f(int k){
	if(k==13){ //当数字为13的时候,可以不同return,因为后面for循环它通不过 
		if(check())
		ans++;
	}
	for(int i=k;i<13;i++){
		{
		int t=a[i];
		a[i]=a[k];
		a[k]=t;
	}
	continue;
f(k+1);
{
		int t=a[i];  //回溯,返回原来状态 
		a[i]=a[k];
		a[k]=t;
}
}
int main(){
	f(0);
	cout<<ans<<endl; 
	return 0;
}

 第二种代码🌊

{int t=a[i];a[i]=a[k];a[k]=t;};
这一行确定了k的位置

#include<iostream>
using namespace std;

int a[]={1,2,3,4,5,6,7,8,9,10,11,12,13};
int ans;
bool check(){
	if(a[0]+a[1]==a[2]&&
	a[3]-a[4]==a[5]&&
	a[6]*a[7]==a[8]&&
	a[9]%a[10]==0&&
	a[9]/a[10]==a[11])
	return true;
	return false;
}
int f(int k){
	if(k==13){ //当数字为13的时候,可以不同return,因为后面for循环它通不过 
		if(check())
		ans++;
	}
	for(int i=k;i<13;i++){
		{int t=a[i];a[i]=a[k];a[k]=t;}
		//提前检知,节省运行时间 
	if((k==2&&a[0]+a[1]!=a[2])||k==5&&a[3]-a[4]!=a[5]){  //判断符合条件,再进行递归,不符合直接退出 
	{int t=a[i];a[i]=a[k];a[k]=t;}
	continue;
}
f(k+1);
{int t=a[i];a[i]=a[k];a[k]=t;}//回溯,返回原来状态
}
}
int main(){
	f(0);
	cout<<ans<<endl; 
	return 0;
}

第四题 「剪邮票」2016初赛🐯

题目描述

如下图, 有12张连在一起的12生肖的邮票。现在你要从中剪下5张来,要求必须是连着的。(仅仅连接一个角不算相连)

2ecf2bc81a86969e4979ed89fac9ac33.png


比如,下面两张图中,粉红色所示部分就是合格的剪取。

e7f0e0f00cdf91e8c8cd0bcf407e5aa4.png

1402eea6d67540541bddf6b39116f61d.png


请你计算,一共有多少种不同的剪取方法。

输出格式

请填写表示方案数目的整数。

分析🐯

这样用搜索搜不出来,可以先找出小邮票,如果能拼成一个大的邮票,则答案加1。

代码🐯

#include <iostream>
#include <cstring>

using namespace std;
int g[3][4],cnt,ans,num[5],vis[3][4];
const int dir[4][2]= {{1,0},{-1,0},{0,1},{0,-1}};

void dfs(int x,int y) {
	vis[x][y]=1;//确保不会被重复搜索
	cnt++;//cnt=5了就代表5个小邮票可以连成一片
	for(int i=0; i<4; i++) {
		int dx=x+dir[i][0];
		int dy=y+dir[i][1];
		if(dx<3 && dy<4 && dx>=0 && dy>=0 && vis[dx][dy]==0 &&g[dx][dy]==1) {
			dfs(dx,dy);
		}
	}
}

void solve(int step,int k) {
	if(step == 5) {//凑够5个数了就把他存到图
		int x,y;
		for(int i=0; i<5; i++) {
			x=(num[i]-1)/4;
			y=(num[i]-1)%4;
			g[x][y]=1;
		}
		dfs((num[0]-1)/4,(num[0]-1)%4);
		if(cnt==5) {
			ans++;
		}
		cnt=0;//用完置为0,不然数据就错了
		memset(g,0,sizeof(g));
		memset(vis,0,sizeof(vis));
		return;
	}
	for(int i=k+1; i<=12; i++) {//生成一个5个数序列,其实用next_permutation函数也行
		num[step]=i;
		solve(step+1,i);
	}
}


int main() {
	solve(0,0);
	cout<<ans<<endl;
	return 0;
}

 最后🍊

最后还是祝各位有个好成绩,这是刷爆题目的第三天,加油吧

9bd3ada4678d4f75a348f02d6453489c.gif

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值