蓝桥杯赛后总结

目录

1.顺子日期

题目描述

解法

2.九进制转十进制

题目描述

解法

3.刷题统计

题目描述

解法

代码实现

4.修剪灌木

题目描述

解法

代码实现

5.X进制减法

题目描述

解法

代码实现

6.统计子矩阵

题目描述

解法

代码实现

7.积木画

题目描述

解法

代码实现

8.扫雷

题目描述

解法

代码实现

9.李白打酒加强版

题目描述

解法

代码实现

10.砍竹子

题目描述

解法

代码实现


1.顺子日期

题目描述

小明特别喜欢顺子。顺子指的就是连续的三个数字:123、456 等。顺子日 期指的就是在日期的 yyyymmdd 表示法中,存在任意连续的三位数是一个顺 子的日期。例如 20220123 就是一个顺子日期,因为它出现了一个顺子:123; 而 20221023 则不是一个顺子日期,它一个顺子也没有。小明想知道在整个 2022 年份中,一共有多少个顺子日期。

答案:4或14

解法

当时就直接暴力找的,也没写对,答案为4的时候是排除了012的情况,答案为14的时候是包含了012的情况。

2.九进制转换十进制

题目描述

九进制正整数 (2022)9 转换成十进制等于多少?

答案:1478

解法

类似于二进制的解法,取2022的每一位数字,从右到左分别按9的0次方,9的一次方,9的二次方,9的三次方,所以结果就为2*1+2*9+0*9*9+2*9*9*9=1478。

3.刷题统计

题目描述

小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天 做 a 道题目,周六和周日每天做 b 道题目。请你帮小明计算,按照计划他将在 第几天实现做题数大于等于 n 题?

输入

输入一行包含三个整数 a, b 和 n.
对于 50% 的评测用例,1 ≤ a, b, n ≤ 1e6 . 
对于 100% 的评测用例,1 ≤ a, b, n ≤ 1e18 .

输出

输出一个整数代表天数。

样例输入

10 20 99

样例输出

8

解法

        直接暴力写的话,肯定会炸的,所以要取模运算,直接算出一周可以写的题数,然后求出不足一周的剩余题数,再循环判断需要几天,直接用之前的周数乘以7加上现在的天数就是答案了。

代码实现

#include
using namespace std;
typedef long long int ll;//数据较大需long long 
int main()
{
    ll a,b,n;
    cin>>a>>b>>n;
    ll x=5*a+2*b;//一周的题数
    ll z=n/x*7;
    ll s=n%x;//不足一周的剩余题数
    ll m=0;
    for(int i=1;i<=7;i++)
    {
        if(s<=0)break;
        if(i==6||i==7)//当轮到周六,周天时
        s-=b;
        else s-=a;
        m=i;
    }
    cout<

4.修剪灌木

题目描述

爱丽丝要完成一项修剪灌木的工作。 有 N 棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晚会修剪一棵灌 木,让灌木的高度变为 0 厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始, 每天向右修剪一棵灌木。当修剪了最右侧的灌木后,她会调转方向,下一天开 始向左修剪灌木。直到修剪了最左的灌木后再次调转方向。然后如此循环往复。 灌木每天从早上到傍晚会长高 1 厘米,而其余时间不会长高。在第一天的 早晨,所有灌木的高度都是 0 厘米。爱丽丝想知道每棵灌木最高长到多高。 

输入

一个正整数 N ,含义如题面所述。
对于 30% 的数据,N ≤ 10. 
对于 100% 的数据,1 < N ≤ 10000.

输出

输出 N 行,每行一个整数,第行表示从左到右第 i 棵树最高能长到多高。

样例输入

3

样例输出

4
2
4

解法

这道题就直接找规律,可以直接按数字找规律,也可以按灌木生长找规律。

蓝桥杯赛后总结_第1张图片

代码实现

#include
using namespace std;
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int x=2*(i-1),y=2*(n-i);//x代表当前灌木在向左边剪直到再次剪到该位置时该灌木高度,y代        
                                   表右边
        int m=max(x,y);
        cout<

5.X进制减法

题目描述

进制规定了数字在数位上逢几进一。 X 进制是一种很神奇的进制,因为其每一数位的进制并不固定!例如说某 种 X 进制数,最低数位为二进制,第二数位为十进制,第三数位为八进制,则 X 进制数 321 转换为十进制数为 65。 现在有两个 X 进制表示的整数 A 和 B,但是其具体每一数位的进制还不确 定,只知道 A 和 B 是同一进制规则,且每一数位最高为 N 进制,最低为二进 制。请你算出 A − B 的结果最小可能是多少。 请注意,你需要保证 A 和 B 在 X 进制下都是合法的,即每一数位上的数 字要小于其进制。 

输入

第一行一个正整数 N,含义如题面所述。 第二行一个正整数 Ma,表示 X 进制数 A 的位数。 第三行 Ma 个用空格分开的整数,表示 X 进制数 A 按从高位到低位顺序各 个数位上的数字在十进制下的表示。 第四行一个正整数 Mb,表示 X 进制数 B 的位数。 第五行 Mb 个用空格分开的整数,表示 X 进制数 B 按从高位到低位顺序各 个数位上的数字在十进制下的表示。 请注意,输入中的所有数字都是十进制的。 
对于 30% 的数据,N ≤ 10; Ma, Mb ≤ 8. 
对于 100% 的数据,2 ≤ N ≤ 1000; 1 ≤ Ma, Mb ≤ 100000; A ≥ B.

输出

输出一行一个整数,表示 X 进制数 A − B 的结果的最小可能值转换为十进 制后再模 1000000007 的结果。

样例输入

11
3
10 4 0
3
1 2 0

样例输出

94

当进制为:最低位 2 进制,第二数位 5 进制,第三数位 11 进制时,
减法得到的差最小。此时 A 在十进制下是 108,B 在十进制下是 14,
差值是 94。

解法

对于这道题当时比赛的时候是完全不理解它的样例的,后来听学长讲过之后,明白了这道题的题意。因为要取得该x进制下A-B的最小值,因此可以先将A和B的每一位相减,然后求该位上的进制是多少,由题意发现每一位的进制就是A和B该位上的数字的最大值加1,可以带入题上所给的样例简单算一下,A和B每位相减的值是9,2,0,然后从低位开始看,A为0,B也为0,但因为最小进制为2,因此该位进制特判一下为2,第二位是4和2,因此进制取5,第三位是10和1,取11,和题目下方的提示是相同的,最后按所求进制求出结果,因此答案为(9*5+2)*2+0=94。

代码实现

#include
using namespace std;
typedef long long int ll;
const int N=1e5+10,mod=1e9+7;
ll p[N],q[N],h[N],g[N];
int main()
{
    ll n,a,b;
    cin>>n>>a;
    for(ll i=1;i<=a;i++)
    cin>>p[i];
    cin>>b;
    ll x=max(a,b);//两个数化成进制数可能位数不同,要取最大位数
    for(ll i=x-b+1;i<=x;i++)
    cin>>q[i];
    for(ll i=1;i<=x;i++)
    {
        h[i]=p[i]-q[i];//h[i]代表对每个数的对应进制数取差
        if(p[i]<=0&&q[i]<=0)
        g[i]=2;//g[i]表示每个数的进制是多少
        else
        g[i]=max(p[i]+1,q[i]+1);
    }
    ll m=0;
    for(ll i=1;i<=x;i++)
    {
            m=(m*g[i]+h[i])%mod;
    }
    cout<

6.统计子矩阵

7.积木画

8.扫雷

9.李白打酒加强版

10.砍竹子

这些题就暂时还不会,等待日后探索

你可能感兴趣的:(蓝桥杯,算法,leetcode)