2024 第十五届蓝桥杯个人题解

好数

题目描述

一个整数如果按从低位到高位的顺序,奇数位(个位、百位、万位 · · · )上的数字是奇数,偶数位(十位、千位、十万位 · · · )上的数字是偶数,我们就称之为“好数”。给定一个正整数 N,请计算从 1 到 N 一共有多少个好数。

输入格式

一个整数 N。

输出格式

一个整数代表答案。

样例输入

24

样例输出

7

提示

对于第一个样例,24 以内的好数有 1、3、5、7、9、21、23,一共 7 个。试题 C: 好数 4第十五届蓝桥杯大赛软件赛省赛 C/C++ 大学 B 组【评测用例规模与约定】对于 10% 的评测用例,1 ≤ N ≤ 100。对于 100% 的评测用例,1 ≤ N ≤ 10^7。

#include<bits/stdc++.h>
using namespace std;
bool juge(long long x)//寻找好数
{
    long long y=x;
    long long cnt=0;
    while(y)
    {
        long long a=y%10;
        if(cnt%2==0)
        {
            if(a%2==0)
            {
                return false;
            }
        }
        if(cnt%2==1)
        {
            if(a%2==1)
            {
                return false;
            }
        }
        cnt++;
        y/=10;
    }
    return true;
}
int main()
{
    long long n;
    cin>>n;
    long long cnt=0;
    for(long long i=1;i<=n;i++)
    {
        if(juge(i))
        {
            cnt++;
//          cout<<i<<"\n";
        }
    } 
    cout<<cnt;
    return 0;
 }

R 格式

题目描述

小蓝最近在研究一种浮点数的表示方法:R 格式。对于一个大于 0 的浮点数 d,可以用 R 格式的整数来表示。给定一个转换参数 n,将浮点数转换为 R格式整数的做法是:

1. 将浮点数乘以 2n;

2. 四舍五入到最接近的整数。

输入格式

一行输入一个整数 n 和一个浮点数 d,分别表示转换参数,和待转换的浮点数。

输出格式

输出一行表示答案:d 用 R 格式表示出来的值。

样例输入

2 3.14

样例输出

13

提示

【样例说明】

3.14 × 22 = 12.56,四舍五入后为 13。

【评测用例规模与约定】

对于 50% 的评测用例:1 ≤ n ≤ 10,1 ≤ 将 d 视为字符串时的长度 ≤ 15。

对于 100% 的评测用例:1 ≤ n ≤ 1000,1 ≤ 将 d 视为字符串时的长度≤ 1024;保证 d 是小数,即包含小数点。

在考场上想到这种方法,只能拿到50%的分数。

#include<bits/stdc++.h>
using namespace std;
int main()
{
	long long n;
	long double d;
	cin>>n>>d;
	long double t;
	long long m=round(pow(2,n)*d);
	cout<<m;
	return 0;
}

宝石组合

题目描述

在一个神秘的森林里,住着一个小精灵名叫小蓝。有一天,他偶然发现了一个隐藏在树洞里的宝藏,里面装满了闪烁着美丽光芒的宝石。这些宝石都有着不同的颜色和形状,但最引人注目的是它们各自独特的 “闪亮度” 属性。每颗宝石都有一个与生俱来的特殊能力,可以发出不同强度的闪光。小蓝共找到了N 枚宝石,第 i 枚宝石的 “闪亮度” 属性值为 Hi,小蓝将会从这 N 枚宝石中选出三枚进行组合,组合之后的精美程度 S 可以用以下公式来衡量:

蓝桥杯2024年第十五届省赛真题-宝石组合

其中 LCM 表示的是最小公倍数函数。小蓝想要使得三枚宝石组合后的精美程度 S 尽可能的高,请你帮他找出精美程度最高的方案。如果存在多个方案 S 值相同,优先选择按照 H 值升序排列后字典序最小的方案。

输入格式

第一行包含一个整数 N 表示宝石个数。第二行包含 N 个整数表示 N 个宝石的 “闪亮度”。

输出格式

输出一行包含三个整数表示满足条件的三枚宝石的 “闪亮度”。

样例输入

5
1 2 3 4 9

样例输出

1 2 3

提示

【评测用例规模与约定】

对于 30% 的评测用例:3 ≤ N ≤ 100,1 ≤ Hi ≤ 1000。

对于 60% 的评测用例:3 ≤ N ≤ 2000。

对于 100% 的评测用例:3 ≤ N ≤ 105,1 ≤ Hi ≤ 105。

#include<bits/stdc++.h>
using namespace std;
int a[100005];
vector<int> v[100005];
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i]; 
    }
    sort(a+1,a+1+n);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j*j<=a[i];j++)//找到数a[i]的因子,这种遍历只能找到一半因子
        {
            if(a[i]%j==0)
            {
                v[j].push_back(a[i]);//每次将含有j因子的数存入v[j]中
                if(a[i]/j!=j) v[a[i]/j].push_back(a[i]);//由于上述遍历只能找到一半的因子,所以要通过a[i]/j找到另一半因子,然后将含有另一半因子的数存入数组中
            }
        }
    }
    for(int i=100000;i>=0;i--)//从含有的因子数中的最大值开始寻找
    {
        if(v[i].size()>=3)
        {
            cout<<v[i][0];//先输出第一个是为了方便后面输出的格式真确,(就是为了最后一个元素后面没有空格)
            for(int j=1;j<3;j++)
            {
                cout<<" "<<v[i][j];
            }
            break;
        }
    } 
    return 0;
}

数字接龙

题目描述

小蓝最近迷上了一款名为《数字接龙》的迷宫游戏,游戏在一个大小为N × N 的格子棋盘上展开,其中每一个格子处都有着一个 0 . . . K − 1 之间的整数。游戏规则如下:

1. 从左上角 (0, 0) 处出发,目标是到达右下角 (N − 1, N − 1) 处的格子,每一步可以选择沿着水平/垂直/对角线方向移动到下一个格子。

2. 对于路径经过的棋盘格子,按照经过的格子顺序,上面的数字组成的序列要满足:0, 1, 2, . . . , K − 1, 0, 1, 2, . . . , K − 1, 0, 1, 2 . . . 。

3. 途中需要对棋盘上的每个格子恰好都经过一次(仅一次)。

4. 路径中不可以出现交叉的线路。例如之前有从 (0, 0) 移动到 (1, 1),那么再从 (1, 0) 移动到 (0, 1) 线路就会交叉。

为了方便表示,我们对可以行进的所有八个方向进行了数字编号,如下图2 所示;因此行进路径可以用一个包含 0 . . . 7 之间的数字字符串表示,如下图 1是一个迷宫示例,它所对应的答案就是:41255214。

蓝桥杯2024年第十五届省赛真题-数字接龙

现在请你帮小蓝规划出一条行进路径并将其输出。如果有多条路径,输出字典序最小的那一个;如果不存在任何一条路径,则输出 −1。

输入格式

第一行包含两个整数 N、K。接下来输入 N 行,每行 N 个整数表示棋盘格子上的数字。

输出格式

输出一行表示答案。如果存在答案输出路径,否则输出 −1。

样例输入

3 3
0 2 0
1 1 1
2 0 2

样例输出

41255214

提示

【样例说明】行进路径如图 1 所示。
【评测用例规模与约定】对于 80% 的评测用例:1 ≤ N ≤ 5。对于 100% 的评测用例:1 ≤ N ≤ 10,1 ≤ K ≤ 10。

#include<iostream>
using namespace std;
int main()
{
    cout<<-1;
    return 0;
}

爬山

题目描述

小明这天在参加公司团建,团建项目是爬山。在 x 轴上从左到右一共有 n座山,第 i 座山的高度为 hi。他们需要从左到右依次爬过所有的山,需要花费的体力值为 S = Σni=1hi。

然而小明偷偷学了魔法,可以降低一些山的高度。他掌握两种魔法,第一种魔法可以将高度为 H 的山的高度变为 ⌊√H⌋,可以使用 P 次;第二种魔法可以将高度为 H 的山的高度变为 ⌊H/2⌋,可以使用 Q 次。并且对于每座山可以按任意顺序多次释放这两种魔法。

小明想合理规划在哪些山使用魔法,使得爬山花费的体力值最少。请问最优情况下需要花费的体力值是多少?

输入格式

输入共两行。

第一行为三个整数 n,P,Q。

第二行为 n 个整数 h1,h2,. . . ,hn。

输出格式

输出共一行,一个整数代表答案。

样例输入

复制

4 1 1
4 5 6 49

样例输出

18

提示

【样例说明】将第四座山变为 ⌊√49⌋ = 7,然后再将第四座山变为 ⌊7/2⌋ = 3。体力值为 4 + 5 + 6 + 3 = 18。

【评测用例规模与约定】

对于 20% 的评测用例,保证 n ≤ 8,P = 0。

对于 100% 的评测用例,保证 n ≤ 100000,0 ≤ P ≤ n,0 ≤ Q ≤ n,0 ≤ hi ≤ 100000。

//这个题目没用做出来,只做出了25%的样例
#include<bits/stdc++.h>
using namespace std;
int a[100005];
int main()
{
    int n,p,q;
    cin>>n>>p>>q;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    } 
    sort(a+1,a+1+n);
    for(int i=1;i<=p;i++)
    {
        a[n]=sqrt(a[n]);
        sort(a+1,a+1+n);
    }
    for(int j=1;j<=q;j++)
    {
        a[n]=a[n]/2;
        sort(a+1,a+1+n);
    }
    int sum=0;
    for(int i=1;i<=n;i++)
    {
        sum+=a[i];
    }
    cout<<sum;
    return 0;
}

拔河

题目描述

小明是学校里的一名老师,他带的班级共有 n 名同学,第 i 名同学力量值为 ai。在闲暇之余,小明决定在班级里组织一场拔河比赛。

为了保证比赛的双方实力尽可能相近,需要在这 n 名同学中挑选出两个队伍,队伍内的同学编号连续:{al1, al1+1, ..., ar1−1, ar1} 和 {al2, al2+1, ..., ar2−1, ar2},其中 l1 ≤ r1 < l2 ≤ r2。

两个队伍的人数不必相同,但是需要让队伍内的同学们的力量值之和尽可能相近。请计算出力量值之和差距最小的挑选队伍的方式。

输入格式

输入共两行。

第一行为一个正整数 n。

第二行为 n 个正整数 ai。

输出格式

输出共一行,一个非负整数,表示两个队伍力量值之和的最小差距。

样例输入

5
10 9 8 12 14

样例输出

复制

1

提示

【样例说明】

其中一种最优选择方式:队伍 1:{a1, a2, a3},队伍 2:{a4, a5},力量值和分别为 10 + 9 + 8 = 27,12 + 14 = 26,差距为 |27 − 26| = 1。

【评测用例规模与约定】

对于 20% 的评测用例,保证 n ≤ 50。

对于 100% 的评测用例,保证 n ≤ 103,ai ≤ 109。

#include<bits/stdc++.h>
using namespace std;
long long a[1003]; 
struct node{//定义结构体,找出所有的和,然后记录和的起始位置和终止位置。
    int start;
    int end;
    long long sum;
}pp[1000006];
bool cmp(node a,node b)//定义如何将结构体中的函数进行排序,首先是将求出所有的和从小到大排序,然后如果和相等,就将起始位置从小到大排序,最后就是终止位置。
{
     
    if(a.sum!=b.sum) return a.sum<b.sum;
    else if(a.start!=b.start) return a.start<b.start;
    else return a.end<b.end;
}
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)//计算得出前缀和
    {
        cin>>a[i];
        a[i]+=a[i-1];
    }
    int cnt=0;
    for(int i=0;i<=n;i++)//用两层循环计算得到数组中所有连续元素的和值。
    {
        for(int j=i+1;j<=n;j++)
        {
            pp[cnt].sum=a[j]-a[i];
            pp[cnt].start=i+1;
            pp[cnt].end=j;
            cnt++;
        }
    }
//  for(int i=0;i<cnt;i++)
//  {
//      cout<<pp[i].start<<" "<<pp[i].end<<" "<<pp[i].sum<<"\n";
//  }
    sort(pp,pp+cnt,cmp);//将结构体进行排序
//  for(int i=0;i<cnt;i++)
//  {
//      cout<<pp[i].start<<" "<<pp[i].end<<" "<<pp[i].sum<<"\n";
//  }
//  cout<<"\n";
    long long min1=0x3f3f3f;
    long long x;
    for(int i=1;i<cnt;i++)//找到最小的和值,但是和值的起始位置和终止位置没有交集
    {
        if(pp[i].start<=pp[i-1].end) 
        {
            x=abs(pp[i].sum-pp[i-1].sum);
            min1=min(min1,x);
        }
    }
    cout<<min1;
    return 0;
}

  • 24
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ssssss555555777777

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

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

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

打赏作者

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

抵扣说明:

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

余额充值