蓝桥杯真题

2020车牌问题:A 市的车牌由六位组成, 其中前三位可能为数字 0 至 9 , 或者字母 A 至F, 每位有 16 种可能。后三位只能是数字 0 至 9。为了减少攀比, 车牌中不能有连 续三位是相同的字符。

例如202020是合法的车牌,AAA202不是合法的车牌,请问A市有多少个合法的车牌

//暴力算法,有三位数字相同时不计数
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
    long long ans = 0;
    for (int i = 0; i <= 15; i++) {
        for (int j = 0; j <= 15; j++) {
            for (int k = 0; k <= 15; k++) {
                if (i == j && j == k)
                    continue;
                for (int q = 0; q <= 9; q++) {
                    if (k == q && j == k)
                        continue;
                    for (int w = 0; w <= 9; w++) {
                        if (k == q && q == w)
                            continue;
                        for (int e = 0; e <= 9; e++) {
                            if (q == w && w == e)
                                continue;
                            ans++;
                        }
                    }
                }
            }
        }
    }
    printf("%lld\n", ans);
    return 0;
}

2020数青蛙问题:“一只青蛙一张嘴, 两只眼睛四条腿。两只青蛙两张嘴, 四只眼睛八条腿。 三只青蛙三张嘴, 六只眼睛十二条腿⋯⋯ 二十只青蛙二卜张嘴, 四十只眼睛八 十条腿。"

请问上面这段文字, 如果完全不省略, 全部写出来, 从 1 到 20 只青蛙, 总 共有多少个汉字。

约定: 数字 2 单独出现读成 “两”, 在其他数里面读成 “二”, 例如 “十二”。 10 读作 “十”, 11 读作 “十一”, 22 读作 “二十二”。 只计算汉字个数,标点符号不算

//找规律
#include <stdio.h>
#include <stdlib.h>
int get(int n){
  if(n>=1&&n<=10){
    return 1;
  }
  if(n>=11&&n<=20||n%10==0){
    return 2;
  }
  return 3;
}
int main(int argc, char *argv[])
{
  // 请在此输入您的代码
  int ans=0;
  int i=0;
  for(i=1;i<=20;i++){
    ans+=get(i);//青蛙
  }
  for(i=1;i<=20;i++){
    ans+=get(i);//嘴
  }
  for(i=2;i<=40;i+=2){
    ans+=get(i);//眼睛
  }
  for(i=4;i<=80;i+=4){
    ans+=get(i);//腿
  }
  printf("%d",ans+200);
  return 0;
}

2021双阶乘问题:一个正整数的双阶乘, 表示不超过这个正整数且与它有相同奇偶性的所有 正整数乘积。 n的双阶乘用n!!表示。请问 2021 ! !的最后 5 位 (这里指十进制位) 是多少?

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
  long long sum=1;
  for(int i=2021;i>0;i-=2){
    sum*=i;
    sum%=100000;//还不是很理解
  }
  printf("%lld",sum);
  return 0;
}

P进制乘法表:给定 P,请输出 P 进制下的乘法表,输入一个整数 P,输出P进制下的乘法表

示例:4进制乘法表

				1*1=1
				2*1=2 2*2=10
				3*1=3 3*2=12 3*3=21
#include <iostream>
#include <algorithm>
using namespace std;
int P;
char w[36];
string change(int n)
{
    string s;
    while(n)
    {
        s += w[n % P];
        n /= P;
    }
    reverse(s.begin(), s.end());
    return s;
}
int main()
{
    cin >> P;   
    for (int i = 0; i <= 9; i ++) w[i] = (char)('0' + i);//0~9
    for (int i = 10; i <= 35; i ++) w[i] = (char)('A' + i - 10);//A~Z
    for (int i = 1; i < P; i ++)
    {
        for (int j = 1; j <= i; j ++) cout << w[i] << '*' << w[j] << '=' << change(i * j) << ' ';
        cout << endl;
    }
    return 0;
}

2020斐波那契问题:定义了一个 Fibonacci 集合 F, 集合的元素如下定义:

  • 最小的 5 个 Fibonacci 数 1,2,3,5,8 属于集合 F
  • 如果一个元素 x 属于 F, 则 3x+2 ,5x+3和 8 x+5 都属于集合 F
  • 其他元素都不属于 F

请问这个集合中第2020个元素是多少?

//深度搜索题,暴力算法
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdio>
using namespace std;
int fx[100010];
bool is[100010];
void dfs(int n){
	if(n > 100000) return ;
	is[n] = true;
	dfs(n*3+2);
	dfs(n*5+3);
	dfs(n*8+5);
}
int main(){
	dfs(1);
	dfs(2);
	dfs(3);
	dfs(5);
	dfs(8);
	int sum = 0;
	for(int i = 1;i<=100010;i++){
		if(is[i]){
			sum ++;
			if(sum == 2020){
			cout<<i<<endl;
				break;
			}
		}
	}
	return 0;
}

2020画中漂流问题:

题目描述:

在梦境中,你踏上了一只木筏,在江上漂流。
根据对当地的了解,你知道在你下游 D 米处有一个峡谷,如果你向下游前进大于等于 D 米则必死无疑。
现在你打响了急救电话,T 秒后救援队会到达并将你救上岸,水流速度是 1 米/秒,你现在有 M 点体力。
每消耗一点体力,你可以划一秒桨使船向上游前进 1 米,否则会向下游前进 1 米(水流),M 点体力需在救援队赶来前花光。
因为江面太宽了,凭借你自己的力量不可能上岸,请问,有多少种划桨的方案可以让你得救。
两个划桨方案不同是指:存在某一秒钟,一个方案划桨,另一个方案不划。

输入格式:

输入一行包含三个整数 D, T, M。

输出格式:

输出一个整数,表示可以让你得救的总方案数,答案可能很大,请输出方案数除以 1,000,000,007 的余数。

输入样例:

1 6 3

输出样例:

5

数据范围:

对于 50% 的评测用例,1 ≤ T ≤ 350
对于所有评测用例,1 ≤ T ≤ 3000 , 1 ≤ D ≤ T , 1 ≤ M ≤ 1500

/DFS算法
#include <iostream>
using namespace std;
const int MOD = 1e9 + 7;
int ans;
int D, T, M;
void dfs(int T, int M, int D)       // 距离救援还有 T 秒,还剩 M 点体力,距离峡谷还有 D 米
{
    if(!T)//如果时间为0即救援到达
    {
        if(!M) ans = (ans + 1) % MOD;//如果没有体力
        return;
    }
    if(M > 0) dfs(T - 1, M - 1, D + 1);// 体力没消耗完且还没被救出则消耗体力,并递归调用,时间减少,体力减少,但距离增加了
    if(D > 1) dfs(T - 1, M, D - 1);// 体力消耗完了但还没被救出,则只能等着时间减少,距离减少
int main()
{
    cin >> D >> T >> M;   
    dfs(T, M, D);
    cout << ans << endl;
    return 0;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值