蓝桥杯刷题(一)


在这里插入图片描述

蓝桥杯题库

1.单词分析

在这里插入图片描述在这里插入图片描述

我本人其实是比较讨厌操作字符的,因为比较麻烦,所以我将字符都用ascll码值表示。例如‘a’=97,‘b’=98,c=‘99’,所以b-a=1

#include<stdio.h>
#include<stdlib.h>
int main()
{
 char input;
 char arr[26]={0};//一共26个字母
 int max=0;
 int i=0;
 while((input=getchar())!='\n')//使用getchar一个一个接收字符,我也用过scanf来接收,但scanf要么是接收字符串,要么就必须每敲一个字符敲一下回车
 {
   arr[input-'a']++;//注意arr[?]是表示这个元素,不是数组
 }
 for(i=0;i<26;i++)//26个字母依次比较
 {
   if(arr[i]>arr[max])
   {
     max=i;
   }
 }
 printf("%c\n%d",max+'a',arr[max]);
 return 0;
}

2.成绩统计

在这里插入图片描述在这里插入图片描述

这道题写代码很简单,主要考察输出部分,如何输出百分号并四舍五入

#include <stdio.h>

int main()
{
  int n=0,i=0,input=0,pass=0,good=0;
  scanf("%d",&n);
  int arr[10001]={0};
  for(i=0;i<n;i++)
  {
    scanf("%d",&arr[i]);//把每个成绩都用数组存起来
    if(arr[i]>=60)
    {
      pass++;
    }
    if(arr[i]>=85)
    {
      good++;
    }
  }
  printf("%.0f%%\n",(pass*100)/(n*1.0));//想变成百分比,再多加两个%就可以了
  printf("%.0f%%\n",(good*100)/(n*1.0));//0.f就是小数点后保留0位,就是四舍五入到整数了

  return 0;
}

3.最短路

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  printf("6");//人脑神经计算法
  return 0;
}

大神解法,反正我是看不懂…

#include <iostream>
#include <cstring>
using namespace std;
const int N=200,n=19;
int dist[N];
int g[N][N];
void add(char x,char y,int c)
{
  int a=x-'A'+1;
  int b=y-'A'+1;
  g[a][b]=g[b][a]=c;
}
bool vis[N];
int dijkstra()
{
  memset(dist,0x3f,sizeof dist);
  dist[1]=0;
  for(int i=0;i<n;i++)
  {
    int t=-1;
    for(int j=1;j<=n;j++)
    {
      if(!vis[j]&&(t==-1||dist[j]<dist[t]))
        t=j;
    }
    vis[t]=1;

    for(int j=1;j<=n;j++)
    {
      dist[j]=min(dist[j],dist[t]+g[t][j]);
    }
  }
  return dist[n];
}
int main()
{
    memset(g,0x3f,sizeof g);
    add('A','B',2);
    add('A','C',1);
    add('A','D',1);
    add('A','D',1);
    add('B','J',2);
    add('B','G',1);
    add('C','D',3);
    add('C','F',3);
    add('C','G',3);
    add('D','E',1);
    add('D','G',2);
    add('D','H',1);
    add('D','I',2);
    add('E','H',1);
    add('E','I',3);
    add('F','G',1);
    add('F','J',1);
    add('G','F',1);
    add('G','I',3);
    add('G','K',2);
    add('H','I',1);
    add('H','L',2);
    add('I','M',3);
    add('J','S',2);
    add('K','N',1);
    add('K','L',3);
    add('K','P',2);
    add('L','M',1);
    add('L','R',1);
    add('M','N',2);
    add('M','Q',1);
    add('M','S',1);
    add('N','P',1);
    add('O','P',1);
    add('O','Q',1);
    add('O','R',3);
    add('R','S',1);
    cout<<dijkstra();
  return 0;
}

4.门牌制作

在这里插入图片描述

这道题主要考两方面,一是如何得出每个数有多少个2,二是如何将每个数的2的个数相加起来

#include <stdio.h>
#include <stdlib.h>

int Count(int i)//计算每个数有多少个2
{
  if(i==0)
  {
    return 0;
  }
  if(i>0)
  {
    if(i%10==2)
    return 1+Count(i/10);
    if(i%10!=2)
    return Count(i/10);
  }
}
int main(int argc, char *argv[])
{
  int sum=0;
  int arr[20000]={0};
  int i=0;
  int j=0;
  int k=0;
  for(i=1;i<=2020;i++)
  {
    arr[j++]=Count(i);//将每个数的2的个数存入数组
  }
  for(k=0;k<j;k++)//将数组中每个数加起来
  {
     sum+=arr[k];
  }
  printf("%d",sum);
  return 0;
}

5.数字三角(较困难)

在这里插入图片描述在这里插入图片描述在这里插入图片描述
难点

这道题的难点是要向左下走的次数与向右下走的次数相差不能超过 1。ps:这说的是全部过程,不是每一步

这里我们通过找规律可以发现如果是奇数行的话,那么它最后总会走到最后一行的中间。
如果是偶数行的话,那么会走到中间两个数的其中一个上

思路

这里我们分为三类(以第4行为例)
1.如果走到最左边(2),那么它肯定是从它的上右那个数字走来的(1)
2.如果走到最右边(4),那么它肯定是从它左上那个数走来的(0)
3.如果走到中间(7),那么它就可能是(8或0)走来的,我们取最大的那个,当然(4)我们也这样看,它的右上我们初始化是0,所以实际上是用(1和0)来比较

#include <stdio.h>
#include <stdlib.h>
int MAX(int a, int b)
{
    return a > b ? a : b;
}
int main()
{
    int n = 0;
    scanf("%d", &n);
    int arr[100][100]={0};
    int i = 0, j = 0;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j <= i; j++)
        {
            scanf("%d", &arr[i][j]);//储存数据
        }
    }
    for (i = 0; i < n; i++)//实际上是求出从第一行到该行数值总和
    {
        for (j = 0; j <= i; j++)
        {
            if (i > 0)//从第二行开始
            {
                if (j == 0)//最右边
                {
                    arr[i][j] += arr[i - 1][j];
                }
                else if (j == i)//最左边
                {
                    arr[i][j] += arr[i - 1][j - 1];
                }
                else//中间
                {
                  arr[i][j]+= MAX(arr[i - 1][j - 1], arr[i - 1][j]);
                }
            }
        }
    }
    if (n % 2 == 1)//如果是奇数行
    {
        printf("%d\n", arr[n-1][(n-1)/2]);
    }
    else//如果是偶数行
    {
        printf("%d", MAX(arr[n-1][(n-1) / 2], arr[n-1][(n-1) / 2 + 1]));
    }
    return 0;
}
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

咸蛋挞

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

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

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

打赏作者

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

抵扣说明:

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

余额充值