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

大家好啊,我是泡泡,今天的题总体来说不难,大家加油

目录

一、天干地支(模拟)

二、包子凑数(完全背包)

三、求值(暴力)

四、青蛙跳杯子(bfs)

总结


一、天干地支(模拟)

题目链接:天干地支 - 蓝桥云课 (lanqiao.cn)

题目要求:

古代中国使用天干地支来记录当前的年份。

天干一共有十个,分别为:甲(jiǎ)、乙(yǐ)、丙(bǐng)、丁(dīng)、戊(wù)、己(jǐ)、庚(gēng)、辛(xīn)、壬(rén)、癸(guǐ)。

地支一共有十二个,分别为:子(zǐ)、丑(chǒu)、寅(yín)、卯(mǎo)、辰(chén)、巳(sì)、午(wǔ)、未(wèi)、申(shēn)、酉(yǒu)、戌(xū)、 亥(hài)。

将天干和地支连起来,就组成了一个天干地支的年份,例如:甲子。

2020 年是庚子年。

每过一年,天干和地支都会移动到下一个。例如 2021 年是辛丑年。

每过 60 年,天干会循环 6 轮,地支会循环 5 轮,所以天干地支纪年每 60 年轮回一次。例如 1900 年,1960 年,2020年都是庚子年。

给定一个公元纪年的年份,请输出这一年的天干地支年份。

解题思路:

简单模拟,暴力即可

#include<bits/stdc++.h>
using namespace std;
string a[10] = {"jia","yi","bing","ding","wu","ji","geng","xin","ren","gui"};
string b[12] = {"zi","chou","yin","mao","chen","si","wu","wei","shen","you","xu","hai"};
int main()
{
	int n;
	cin>>n;
	int l = 6,r = 8;
	for(int i=0;i<n;i++)
	{
		l++;
		r++;
		if(l == 10)
		{
			l = 0;
		}
		if(r == 12)
		{
			r = 0;
		}
	}
	cout<<a[l]<<b[r];
	return 0;
} 

二、包子凑数(完全背包)

题目链接:“蓝桥杯”练习系统 (lanqiao.cn)

题目要求:

小明几乎每天早晨都会在一家包子铺吃早餐。他发现这家包子铺有N种蒸笼,其中第i种蒸笼恰好能放Ai个包子。每种蒸笼都有非常多笼,可以认为是无限笼。

每当有顾客想买X个包子,卖包子的大叔就会迅速选出若干笼包子来,使得这若干笼中恰好一共有X个包子。比如一共有3种蒸笼,分别能放3、4和5个包子。当顾客想买11个包子时,大叔就会选2笼3个的再加1笼5个的(也可能选出1笼3个的再加2笼4个的)。

当然有时包子大叔无论如何也凑不出顾客想买的数量。比如一共有3种蒸笼,分别能放4、5和6个包子。而顾客想买7个包子时,大叔就凑不出来了。

小明想知道一共有多少种数目是包子大叔凑不出来的。

解题思路:

这是一个完全背包加数论问题,假如输入的每笼包子的数目不互质的话,包子凑不出来的数目就是无限个,用递归求两个数的公约数,假如最后不是1,那么就说这两个数不互质,求出两个数的最大公约数之后在和后面的数又进行比较,gcd函数返回两个或多个整数的最大公约数,包子凑数里面说了笼数是无穷笼,直接套完全背包模板修改一下ok了。

#include<bits/stdc++.h>
using namespace std;
int w[10010],dp[10010];
int gcd(int a,int b)
{
	if(b==0)
	{
		return a;
	}
	return gcd(b,a%b);
}
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>w[i];
	}
	int num = w[1];
	for(int i=2;i<=n;i++)
	{
		num = gcd(num,w[i]);
	}
	if(num!=1)
	{
		cout<<"INF";
	}
    else
	{
	dp[0] = 1;
	for(int i=1;i<=n;i++)
	{
		for(int j=w[i];j<=10000;j++)
		{
			dp[j] = max(dp[j],dp[j-w[i]]);
		}
	}
	int ans = 0;
	for(int i=1;i<=10000;i++)
	{
		if(dp[i]==0)
		{
			ans++;
		}
	}
	cout<<ans;
	}
	return 0;
}

三、求值(暴力)

题目链接:求值 - 蓝桥云课 (lanqiao.cn)

题目要求:

学习了约数后,小明对于约数很好奇,他发现,给定一个正整数 t,总是可以找到含有 t 个约数的整数。小明对于含有 tt 个约数的最小数非常感兴趣,并把它定义为 St​ 。

例如 S1​=1,S2​=2,S3​=4,S4​=6,⋅⋅⋅ 。

现在小明想知道,当 t = 100 时,St​ 是多少?即 S100​ 是多少?

解题思路:

暴力!填空题所以跑一下填答案就行,也可以把初始值开大点。

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int num; 
    for(int i=10000;;i++)
    {
        int ans = 0;
        for(int j=1;j<=i;j++)
        {
            if(i%j==0)
            {
                ans++;
            }
        }
        if(ans==100)
        {
        	num = i;
            break;
        }
    }
    cout<<num;
    return 0;
} 

四、青蛙跳杯子(bfs)

题目链接:“蓝桥杯”练习系统 (lanqiao.cn)

题目要求:

    X星球的流行宠物是青蛙,一般有两种颜色:白色和黑色。
  X星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去。
  如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个里边有一只青蛙。

  *WWWBBB

  其中,W字母表示白色青蛙,B表示黑色青蛙,*表示空杯子。

  X星的青蛙很有些癖好,它们只做3个动作之一:
  1. 跳到相邻的空杯子里。
  2. 隔着1只其它的青蛙(随便什么颜色)跳到空杯子里。
  3. 隔着2只其它的青蛙(随便什么颜色)跳到空杯子里。

  对于上图的局面,只要1步,就可跳成下图局面:

  WWW*BBB

  本题的任务就是已知初始局面,询问至少需要几步,才能跳成另一个目标局面。

  输入为2行,2个串,表示初始局面和目标局面。
  输出要求为一个整数,表示至少需要多少步的青蛙跳。

解题思路:

简单的bfs,先找到*的位置然后进行操作6个方向,每次操作完复原一下

#include<bits/stdc++.h>
using namespace std;
string a,b;
int n;
int fx[6]={-3,-2,-1,1,2,3};
map<string,int>dis;
int bfs()
{
	queue<string>q;
	q.push(a);
	dis[a]=0;
	while(q.size())
	{
		string p=q.front();
		q.pop();
		int d=dis[p];
		int x=p.find('*');
		for(int i=0;i<6;i++)
		{
			int z=x+fx[i];
			if(z<0||z>=n)
			{
				continue;
			}
			swap(p[x],p[z]);
			if(!dis.count(p))
			{
				dis[p]=d+1;
				if(p==b)
				{
					return dis[p];
				}
				q.push(p);
			}
			swap(p[x],p[z]);
		}
	}
	return -1;
}
int main()
{
	cin>>a>>b;
	n=a.size();
	cout<<bfs();
	return 0; 
}

总结

今天是第十一天,快到蓝桥杯了,大家加油,一起冲击国赛

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

cloud、泡泡

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

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

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

打赏作者

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

抵扣说明:

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

余额充值