蓝桥杯第10届解析_c++

1.水下探测器

题目描述

水下探测器可以潜入湖中在任意水深进行科学探索。湖水的最大深度为 h 米,即它在湖底时到水面的距离;探测器最初的水下深度为 s 米;当探测器不在水面(当前深度大于 00)时,每个 u 指令可使它上浮 1 米,而当探测器在水面时,u 指令是无效的;当探测器不在湖底(当前深度小于 ℎh)时,每个 d 指令可使它下沉 1 米,而当探测器在湖底时,d 指令是无效的;在执行到无效指令时,探测器不做任何操作而继续执行下一指令。编程实现:根据给定的 ℎ、s 和一个指令序列(由字符 u、d 组成的字符串,长度不超过 100),求出执行完整的指令序列后,探测器的水下深度。

输入格式

第一行:h 和 s,以空格分开。第二行:长度不超过 100 的指令字符串,串中仅包含字母 u 或 d。

输出格式

一个整数,代表探测器在执行指令后的水下深度的数字。

输入数据 1

9 1
uduudd

Copy

输出数据 1

2

Copy

代码编辑

#include <iostream>

using namespace std;

int h,s;

string str;

int main()

{

    cin >> h >> s;

    cin >> str;

    int sum=s;

    for(int i=0;i<str.size();i++)

    {

        if(str[i]=='u')

        {

            if(sum!=0)

            {

                sum--;

            }

        }

        else if(str[i]=='d')

        {

            if(sum!=h)

            {

                sum++;

            }

        }

    }

    cout << sum;

}

2.小猫吃鱼

题目描述

明明家从 1 号站点出发,开车去旅游,一共要经过 n 个站点,依次为 2、3……n。由于明明带上了心爱的小猫,在每个站点都要为小猫提供一条鱼用做美餐(包括 1号站点)。除了 1 号站点只能吃 1 号站点买的鱼,其他站点既可以吃当地买的鱼,也可吃之前经过的站点买了存入车载冰箱中的鱼。但车载冰箱消耗的电能来自汽油,所以每条鱼用冰箱保存到下一站的费用与各个站点的汽油价格有关。为使问题简化,我们约定:(1)车从某站开出时油箱中都是此站点刚加的汽油。(2)车载冰箱能容纳一路上需要的所有鱼。 即:每条鱼的费用既包括购买时的费用,也包括用冰箱保存鱼的费用。编程实现:为了降低小猫吃鱼的总代价,明明预先上网查到了这 n 个站点的鱼价和汽油价格。并据此算出每个站点买一条鱼的费用以及从该站点到下一站用冰箱保存一条鱼的费用。你能帮明明算出这一路上小猫吃鱼的最小总费用吗?

输入格式

第一行:站点数 n;接下来的 n 行:每行两个以空格分隔的正整数,表示:这一站买一条鱼的费用,以及从这一站把每条鱼保存到下一站的费用,两个费用均为小于 10000 的正整数。

输出格式

一个正整数,表示花费的最小费用。

输入数据 1

5
6 3
7 1
3 2
8 3
9 5

Copy

输出数据 1

29

Copy

代码编辑

#include <iostream>

using namespace std;

int n;

int main()

{

    cin >> n;

    int a[10005],b[10005];

    for(int i=0;i<n;i++)

    {

        cin >> a[i] >> b[i];

    }

    int minn=999999;

    int t=0;

    for(int i=0;i<n;i++)

    {

        if(a[i]<minn)

        {

            minn=a[i];

        }

        t+=minn;

        minn+=b[i];

    }

    cout << t;

    return 0;

}

题目描述

n 个评委投票,在 m 个商品中评选一个最佳品牌。评选采用多轮淘汰制,即:每轮投票,淘汰掉得票最少的候选品牌(得票并列最少的品牌一起淘汰)。如此一轮轮淘汰下去,如果最后只剩下一个品牌当选,即告评选成功。但如果在某轮投票中,当时未被淘汰的所有候选品牌(大于等于两个品牌)都并列得票最少,即告评选失败。如果评选成功就输出当选品牌号。否则输出最后一轮评选时唯一选票数的相反数。在评选流程中,每个评委的态度都可用一个序列来表示;例如当 m=5 时,某评委的 评选态度序列为:3、5、1、2、4,则表示该评委:优先投 3 号,当 3 号被淘汰时投 5 号,当 3 和 5 都被淘汰时投 1,当 3、5、1 都被淘汰时投 2,仅剩 4 号时才投 4 号品牌的票。选票的序列中可以表示弃权,用 0 来表示,例如当 m=5 时,某评委的评选态度序列为:3、5、0,则表示该评委:优先投3 号,当 3 号被淘汰时投 5 号,其它情况下不投任何品牌的票。编程实现:请你编一个程序,模拟各轮投票的过程,得到评选结果。

输入格式

第一行两个整数m和n,用空格隔开。m表示参加评选的品牌数和 n表示参加投票的评委数;接下来的 n 行:每行都是长度不超 m 的数字字符串,每个字符串表示一个评委的评选态度。

输出格式

一个整数,表示最后评选结果。

输入数据 1

3 4
123
213
132
10

Copy

输出数据 1

1

Copy

输入数据 2

3 4
321
213
231
312

Copy

输出数据 2

-2

Copy

数据1说明

第一行 3 4 代表 3 个品牌,4 个评委第一轮投票,3 个评委优先选择 1 号品牌,1个评委选择 2 号品牌,品牌 3 得票最少, 淘汰掉;第二轮投票,3 个评委优先选择 1 号品牌,1 个评委选择 2 号品牌,品牌 2 得票最少, 淘汰掉。只剩一个1号品牌胜出。

数据2说明

第一行 3 4 代表 3 个品牌,4 个评委第一轮投票,2 个评委选择 2 号品牌,2 个评委选择 3 号品牌,1 号得票最少,淘汰掉;第二轮投票,2个评委选择 2 号品牌,2 个评委选择 3 号品牌,由于只剩下两个品牌, 且并列最少,都是 2 票,代表评选失败,需要输出最后一轮票数 2 的相反数−2;最终结果 −2。

代码编辑

#include<iostream>

#include<algorithm>

#include<cstring>

#include<fstream>

using namespace std;

const int M=15,N=1010;

int g[N][M];//存储评委投票态度

int piao[M];//得票桶

int st[M];//品牌标识桶

bool success=true;

int last_piaoshu;

int last_pinpai;

int n,m;//n个评委 m个品牌

void pingxuan()

{

    while(1){

        memset(piao,0,sizeof(piao));

        for(int i=1;i<=n;i++)

            for(int j=1;j<M;j++){

                int k=g[i][j];

                if(k==0) break;//弃权票

                if(st[k])continue;//品牌已淘汰

                piao[k]++;//投票入桶

                break;//投票完成换下个评委

            }

        //寻找最大票数和最小票数

        int min=1001,max=-1001;

        for(int i=1;i<M;i++){

            if(piao[i]<min && !st[i])min=piao[i];

            if(piao[i]>max && !st[i])max=piao[i];

        }

        if(max>min){//淘汰掉最小得票的品牌

            for(int i=1;i<M;i++)

                if(piao[i]==min && st[i]==false)st[i]=true;//标志淘汰

            continue;//进入下一轮评选

        }

        else{

            int sum=0;

            for(int i=1;i<M;i++)//搜索有几个最小票数的品牌

                if(piao[i]==min)sum++,last_pinpai=i;

            if(sum==1)return;//只剩一个品牌,结束循环

            else{//剩余多个品牌,评选失败

                last_piaoshu=min;//保留最后一轮的得票

                success=false;//标识失败

                return ;//评选结束 退出循环

            }

        }  

    }

}

int main()//开始主体部分

{

    cin>>m>>n;

    for(int i=1;i<=n;i++){

        string str;

        cin>>str;

        for(int j=0;j<str.size();j++)

            g[i][j+1]=str[j]-'0';

    }

    pingxuan();//导入函数

    if(success)

    {

    cout<<last_pinpai<<endl;

    }

    else {

        cout<<"-"<<last_piaoshu<<endl;

    }

    return 0;  

}

3.蓝桥杯赛迷宫

题目描述

把一个 n 行 m 列的字符阵列看做一个迷宫,迷宫仅包含 L、Q、B、S 中的大写母(蓝桥杯赛的汉语拼音首字母)。初始时,你可以从任意一个“L”字母开始,移向相邻的“Q”字母,然后从此“Q”字母出发,移向相邻的“B”字母,然后从此“B”字母出发,移向相邻的“S”字母……。这样,你就算是走过了一个“LQBS”字符序列。接下来,仍然可以从此“S”字母出发,移向相邻的“L”字母……,重复上述的动作,你就可以不断地走过“LQBS”序列。请注意,所谓相邻仅包含上、下、左、右 4个方向,且只能从 L->Q,从 Q->B,从B->S,从 S->L。可以想像,由于选择的出发点不同,我们有可能在迷宫中走过无数次的“LQBS”,或者是有限次的“LQBS”,或者一次也走不了。编程实现:请你编写程序,求出在给定的迷宫中,我们最多可以走过多少次“LQBS”?

输入格式

第一行:正整数 n,m,表示迷宫的规模为 n 行 m 列;接下来的 n 行:每行 m 个符合题意的字母,字母间无空格。

输出格式

一个整数。即:如果在迷宫中可以无限次的走过“LQBS”,输出−1,否则,输出可以走过“LQBS”的最多次数

输入数据 1

1 2
LQ

Copy

输出数据 1

0

Copy

输入数据 2

3 3
LSB
QBQ
BSL

Copy

输出数据 2

-1

Copy

输入数据 3

4 4
BLQB
BBQS
SBQL
QQQQ

Copy

输出数据 3

2

代码编辑 

#include<iostream>

#include<algorithm>

#include<fstream>

using namespace std;

const int N=110;

char g[N][N];

int f[N][N];

int n,m;

bool wuxian;

int mstep,step=1;

int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};

void dfs(int x,int y){

    for(int i=0;i<4;i++){

        int xx=x+dx[i],yy=y+dy[i];

        if(xx<0||xx>n-1||yy<0||yy>m-1)continue;

        if((g[x][y]=='L' && g[xx][yy]=='Q')||(g[x][y]=='Q' && g[xx][yy]=='B')||

        (g[x][y]=='B' && g[xx][yy]=='S')||(g[x][y]=='S' && g[xx][yy]=='L')){

            if(f[xx][yy]){

                wuxian=true;

                return ;

            }

            f[xx][yy]=1;

            step++;

            mstep=max(mstep,step);

            dfs(xx,yy);

            f[xx][yy]=0;

            step--;

        }  

    }

    return ;

}

int main()

{

    cin>>n>>m;

    for(int i=0;i<n;i++) cin>>g[i];

    for(int i=0;i<n;i++){

        for(int j=0;j<m;j++){

            if(g[i][j]=='L'){

                memset(f,0,sizeof(f));

                dfs(i,j);

            }

            if(wuxian){

                cout<<-1<<endl;

                return 0;

            }

        }

    }

    cout << mstep/4 << endl;

    return 0;

}

题目描述

核桃大促销又来了,长长的购物单,都是有打折优惠的。 请你帮他计算一下,需要从取款机上取多少现金,才能搞定这次购物。 取款机只能提供 100100 元面额的纸币。小明想尽可能少取些现金,够用就行了。 你的任务是计算出,小明最少需要取多少现金。

180.90 88 折

10.25  65 折

56.14  9 折

104.65  9 折

100.30  88 折

297.1  55折

26.75  65 折

130.62  5折

输入格式

无。

输出格式

一个整数,表示小明最少需要取多少现金。

代码编辑

#include <iostream>

using namespace std;

double sum=0;

int main()

{

    sum+=180.9*0.88;

    sum+=10.25*0.65;

    sum+=56.14*0.9;

    sum+=104.65*0.9;

    sum+=100.3*0.88;

    sum+=297.15*0.5;

    sum+=26.75*0.65;

    sum+=130.62*0.5;

    for(int i=0;i<=2000;i+=100)

    {

        if(i-sum>=0)

        {

            cout << i;

            break;

        }

    }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值