当前位置 博文首页 > binflcy的博客:蓝桥杯基础试题整合

    binflcy的博客:蓝桥杯基础试题整合

    作者:[db:作者] 时间:2021-09-21 18:10

    蓝桥杯基础试题整合C++

    还剩3天,一定一定要回顾之前掌握的最基础的知识!从基础试题整理,每一题都会抽象对应的考点,如果后续题中出现重复的考点将不再累述。(全文都是基于C++编写,希望对你能有所帮助)
    【传送门】
    第六届蓝桥杯大赛个人赛省赛(软件类) C/C++大学B组
    第十届蓝桥杯大赛软件类省赛C/C++大学B组
    第十一届蓝桥杯大赛软件类省赛第二场C/C++大学B组
    第十二届蓝桥杯大赛模拟赛(第四期)
    第七届蓝桥杯大赛个人赛省赛(软件类) C/C++大学B组
    蓝桥杯基础试题整合C++

    一、数列排序

    问题描述
      给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200
    输入格式
      第一行为一个整数n。
      第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000。
    输出格式
      输出一行,按从小到大的顺序输出排序后的数列。
    样例输入
    5
    8 3 6 4 9
    样例输出
    3 4 6 8 9

    分析:

    1.考查简单的输入、输出(cin>>,cout<<)
    2.排序函数sort()【重点说明】
    3.循环for语句
    4.#include <bits/stdc++.h> 几乎万能头文件

    试题答案

    #include <bits/stdc++.h>//万能头文件
    using namespace std;
    int main()
    {
        int n,a[200];
        cin>>n;//输入n的值
        cin>>a[0];
        for(int i=1;i<n;i++){//for循环函数,输入下标1~n-1的值
            cin>>a[i];
        }
        sort(a,a+n);//排序,该试题模块最后有详细的使用说明
        for(int i=0;i<n;i++){
            cout<<a[i]<<" ";//输出
        }
        return 0;
    }
    

    在这里插入图片描述
    重点说明sort()函数

    1.功能:对数组进行排序
    2.参数含义
    (1)包含2个参数 sort(arr,arr+n) :arr表示数组,n表示数组中从下标0开始参与排序的个数,默认按照升序排序
    (2)包含3个参数 sort(arr,arr+n,cmp):cmp函数可以修改排序规则,它的返回值是一个bool类型,如果我们需要得到此题的降序排序,当然降序还有一种写法greater<数据类型>()
    (代码如下)

    #include <bits/stdc++.h>
    using namespace std;
    bool cmp_1(int a,int b){
        return a>b;
    }
    bool cmp_2(char a,char b){
        return a>b;
    }
    int main()
    {
        int a[5]={1,5,4,6,2};
        char b[6]="afghj";
        char c[6]="adlkj";
        sort(a,a+5,cmp_1);
        sort(b,b+5,cmp_2);
        sort(c,c+5,greater<char>());
        for(int i=0;i<5;i++){
            cout<<a[i];
        }
        cout<<endl;
        for(int i=0;i<5;i++){
            cout<<b[i];
        }
        cout<<endl;
        for(int i=0;i<5;i++){
            cout<<c[i];
        }
        return 0;
    }
    

    相关试题: 数列特征(同样涉及到了排序)

    问题描述
    给出n个数,找出这n个数的最大值,最小值,和。
    输入格式
    第一行为整数n,表示数的个数。
    第二行有n个数,为给定的n个数,每个数的绝对值都小于10000。
    输出格式
    输出三行,每行一个整数。第一行表示这些数中的最大值,第二行表示这些数中的最小值,第三行表示这些数的和。
    样例输入
    5
    1 3 -2 4 5
    样例输出
    5
    -2
    11
    数据规模与约定
    1 <= n <= 10000。

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
        int n,sum=0;
        cin>>n;
        int num[n];
        for(int i=0;i<n;i++){
            cin>>num[i];
            sum+=num[i];
        }
        sort(num,num+n);
        cout<<num[n-1]<<endl;
        cout<<num[0]<<endl;
        cout<<sum<<endl;
        return 0;
    }
    

    在这里插入图片描述
    相关试题:Huffuman树(同样涉及到了排序)

    问题描述
      Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。
      给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的过程如下:
      1. 找到{pi}中最小的两个数,设为pa和pb,将pa和pb从{pi}中删除掉,然后将它们的和加入到{pi}中。这个过程的费用记为pa + pb。
      2. 重复步骤1,直到{pi}中只剩下一个数。
      在上面的操作过程中,把所有的费用相加,就得到了构造Huffman树的总费用。
      本题任务:对于给定的一个数列,现在请你求出用该数列构造Huffman树的总费用。
    例如,对于数列{pi}={5, 3, 8, 2, 9},Huffman树的构造过程如下:
      1. 找到{5, 3, 8, 2, 9}中最小的两个数,分别是2和3,从{pi}中删除它们并将和5加入,得到{5, 8, 9, 5},费用为5。
      2. 找到{5, 8, 9, 5}中最小的两个数,分别是5和5,从{pi}中删除它们并将和10加入,得到{8, 9, 10},费用为10。
      3. 找到{8, 9, 10}中最小的两个数,分别是8和9,从{pi}中删除它们并将和17加入,得到{10, 17},费用为17。
      4. 找到{10, 17}中最小的两个数,分别是10和17,从{pi}中删除它们并将和27加入,得到{27},费用为27。
      5. 现在,数列中只剩下一个数27,构造过程结束,总费用为5+10+17+27=59。
    输入格式
      输入的第一行包含一个正整数n(n<=100)。
      接下来是n个正整数,表示p0, p1, …, pn-1,每个数不超过1000。
    输出格式
      输出用这些数构造Huffman树的总费用。
    样例输入
    5
    5 3 8 2 9
    样例输出
    59

    #include <bits/stdc++.h>
    using namespace std;
    
    int main()
    {
        int n,sum;
        sum=0;
        cin>>n;
        int P[n];
        for(int i=0;i<n;i++){
            cin>>P[i];
        }
        sort(P,P+n);
        while(n>1){
            P[0]=P[0]+P[1];
            P[1]=P[n-1];
            n--;
            sum+=P[0];
            sort(P,P+n);
        }
        cout<<sum<<endl;
        return 0;
    }
    

    在这里插入图片描述

    二、十进制转十六进制

    问题描述
      十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,分别表示十进制数的0至15。十六进制的计数方法是满16进1,所以十进制数16在十六进制中是10,而十进制的17在十六进制中是11,以此类推,十进制的30在十六进制中是1E。
      给出一个非负整数,将它表示成十六进制的形式。
    输入格式
      输入包含一个非负整数a,表示要转换的数。0<=a<=2147483647
    输出格式
      输出这个整数的16进制表示
    样例输入
    30
    样例输出
    1E

    分析:

    1.考查简单标准整数类型常见存储空间大小和取值范围【附表】
    2.进制转化【重点说明】
    在这里插入图片描述

    试题答案

    #include <bits/stdc++.h>
    using namespace std;
    int main()
    {
        string s;
        int a;
        cin>>a;
        cout<<setiosflags(ios::uppercase)<<hex<<a<<endl;
        return 0;
    }
    
    

    在这里插入图片描述
    重点说明进制转化(利用输入输出流)

    1.利用输入输出进行转化,cin<<、cout>>、printf 默认是十进制式,
    2.oct为八进制,hex为十六进制,dec为十进制。
    3.cout<<是否有大写需求如果有的话(setiosflags(ios::uppercase))<<某种进制<<要转化的数
    在这里插入图片描述
    是不是很简单,但是这种做法有一个很致命的问题,因为要首先转化成10进制的整形,可是整形的长度是有规定的,即使是长整形对待16进制的转化还是不足够的!但是对于较简单的转换,或是10进制转化还是可以尝试一下的。

    相关试题: 十六进制转十进制

    #include <bits/stdc++.h>
    using namespace std;
    int main()
    {
        string s;
        long long int a;
        cin>>s;
        stringstream ss;;
        ss<<hex<<s;
        ss>>a;//转成10进制
        cout<<a<<endl;
        return 0;
    }
    
    

    在这里插入图片描述

    重点说明进制转化(常规做法)

    以下是进制转化的常规做法的相关试题:十六进制转八进制
    首先将十六转化成二进制,用整形数组存放,再将它转化成八进制[注意前导0的处理]
    补充知识点:memset(数组名,赋值,sizeof(数组名)); 就可以改变数组的默认值了

    #include<bits/stdc++.h>
    using namespace std;
    char s1[1000000+10];//字符型数组存放十六进制
    int  s2[5000000+10],s3[5000000+10];//整形数组存放二进制和八进制
    int main(){
    	int n,j,i;
    	cin>>n;
    	getchar();
    	while (n--)
    	{
    		memset(s1,'\0',sizeof(s1));
    		memset(s2,0,sizeof(s2));
    		memset(s3,0,sizeof(s3));
    		gets(s1);
    		int len = strlen(s1);
    		j=0;
    		for (