大家好啊,我是泡泡,今天的题总体来说不难,大家加油
目录
一、天干地支(模拟)
题目要求:
古代中国使用天干地支来记录当前的年份。
天干一共有十个,分别为:甲(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;
}
二、包子凑数(完全背包)
题目要求:
小明几乎每天早晨都会在一家包子铺吃早餐。他发现这家包子铺有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;
}
三、求值(暴力)
题目要求:
学习了约数后,小明对于约数很好奇,他发现,给定一个正整数 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)
题目要求:
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;
}
总结
今天是第十一天,快到蓝桥杯了,大家加油,一起冲击国赛