zoukankan      html  css  js  c++  java
  • 蓝桥杯校内模拟赛C

    写在前面,笔者是初次参加蓝桥杯,也才是昨天考的,不能保证正确性,只做了7道题,纯C。欢迎斧正!!!!

    填空题

    01 约数

    1200000有多少个约数(只计算正约数)。

    #include <stdio.h>
    int main(){
    	int i,n=1200000,count=0;
    	for(i=1;i*i<=n;i++){
    		if(n%i==0)
    			count+=2;
    	}
    	printf("%d",count);
    	return 0;
    }
    

    运行结果——96

    02内存

    在计算机存储中,15.125GB是多少MB?

    #include <stdio.h>
    int main(){
    	double n=15.125;
    	printf("%lf",n*1024);
    	return 0;
    }
    

    运行结果——15488

    03数位为9

    在1至2019中,有多少个数的数位中包含数字9?
      注意,有的数中的数位中包含多个9,这个数只算一次。例如,1999这个数包含数字9,在计算只是算一个数。

    #include <stdio.h>
    int main(){
    	int a,b,c,d,count=0,i;
    	for(i=1;i<=2019;i++){
    		a=i/1000;
    		b=i%1000/100;
    		c=i%100/10;
    		d=i%10;
    		if(a==9||b==9||c==9||d==9) {       //题目要求了一个数值里面如果有多个9还是只算一个,所以用||
    		    count++;
    		}
    	}
    	printf("%d
    ",count);
    	return 0;
    }
    

    运行结果——544

    04树的叶子节点

    一棵包含有2019个结点的树,最多包含多少个叶结点?

    叶结点就是出度为0的结点,即没有子结点的结点。
    ①假设n为完全二叉树的结点总数,n0是度为0的结点总数(即叶子结点数),n1是度为1的结点总数,n2是度为2的结点总数。
    ②由二叉树的性质可知:n0=n2+1,则n= n0+n1+n2。
    ③将上述公式把n2消去可得:n= 2n0+n1-1。
    ④由于完全二叉树中度为1的结点数只有两种可能01,由此得到n0=(n+1)/2或n0=n/2。
    ⑤题目要算的是最多的叶子结点数,根据完全二叉树的结点总数n=2019可以计算出叶子结点数n0=(n+1)/2=1010。
    题目没有说是二叉树,如果只是一棵树的话应该是2018个叶结点。
    

    编程题

    05字符串

    一个正整数如果任何一个数位不大于右边相邻的数位,则称为一个数位递增的数,
    例如1135是一个数位递增的数,而1024不是一个数位递增的数。
      给定正整数 n,请问在整数 1 至 n 中有多少个数位递增的数?
    输入格式
      输入的第一行包含一个整数 n。
    输出格式
      输出一行包含一个整数,表示答案。
    样例输入
    	30
    样例输出
    	26
    评测用例规模与约定
      对于 40% 的评测用例,1 <= n <= 1000。
      对于 80% 的评测用例,1 <= n <= 100000。
      对于所有评测用例,1 <= n <= 1000000。
    思考
    false 为 0 
    true 为 1 
    
    #include <stdio.h>
    int a[10];
    int cmp(int num){
    	int i,str=0;
    	while(num){
    		a[str++]=num%10;
    		num/=10;	  
    	}
    	for(i=str-1;i>0;i--){
    		if(a[i]>a[i-1])	//前一位大于后一位 
    			return 0;	//false 返回 0 
    	} 
    	return 1; 	//true 返回 1 
    } 
    int main(){
    	int n,i,count=0;
    	scanf("%d",&n);
    	for(i=1;i<=n;i++){
    		if(cmp(i))
    			count++;
    	}
    	printf("%d
    ",count);
    	return 0;
    }
    

    06数组

    问题描述
      在数列 a[1], a[2], ..., a[n] 中,如果对于下标 i, j, k 满足 0<i<j<k<n+1 且 a[i]<a[j]<a[k],则称 a[i], a[j], a[k] 为一组递增三元组,a[j]为递增三元组的中心。
      给定一个数列,请问数列中有多少个元素可能是递增三元组的中心。
    输入格式
      输入的第一行包含一个整数 n。
      第二行包含 n 个整数 a[1], a[2], ..., a[n],相邻的整数间用空格分隔,表示给定的数列。
    输出格式
      输出一行包含一个整数,表示答案。
    样例输入
    	5
    	1 2 5 3 5
    样例输出
    	2
    样例说明
      a[2] 和 a[4] 可能是三元组的中心。
    评测用例规模与约定
      对于 50% 的评测用例,2 <= n <= 1000 <= 数列中的数 <= 1000。
      对于所有评测用例,2 <= n <= 10000 <= 数列中的数 <= 10000。
    思考
    	一个数只要左边有比它小的右边有比它大的即符合
    	所以暴力解法就是直接暴力,没啥好说的 
    
    #include <stdio.h>
    int main(){
    	int n,a[1010],count=0;
    	int i,j,k; 
    	scanf("%d",&n);
    	for(i=1;i<=n;i++){
    		scanf("%d",&a[i]);
    	}
    	for(i=1;i<n-2;i++){
    		for(j=1+1;j<n-1;j++){
    			for(k=j+1;k<n;k++){
    				if(a[i]<a[j] && a[j]<a[k]){
    					count++;
    				}
    			}
    		}
    	}
    	printf("%d
    ",count);
    	return 0;
    }
    

    07逆序数

    问题描述
      小明对类似于 hello 这种单词非常感兴趣,这种单词可以正好分为四段,第一段由一个或多个辅音字母组成,第二段由一个或多个元音字母组成,第三段由一个或多个辅音字母组成,第四段由一个或多个元音字母组成。
      给定一个单词,请判断这个单词是否也是这种单词,如果是请输出yes,否则请输出no。
      元音字母包括 a, e, i, o, u,共五个,其他均为辅音字母。
    输入格式
      输入一行,包含一个单词,单词中只包含小写英文字母。
    输出格式
      输出答案,或者为yes,或者为no。
    样例输入
    	lanqiao
    样例输出
    	yes
    样例输入
    	world
    样例输出
    	no
    评测用例规模与约定
      对于所有评测用例,单词中的字母个数不超过100。
    思考
    	这道考试没做出来,想了一下,有点麻烦,就没有考虑,pass掉了!!!
    
    /*这是C++代码,参考:https://blog.csdn.net/qq_41146650/article/details/104758218
    */
    #include<bits/stdc++.h>
    using namespace std;
    string s;
    int i=0;
    bool judeg(char c){	// 判断字符是否为元音字母 a, e, i, o, u 
    	return c=='a'||c=='e'||c=='i'||c=='o'||c=='u';
    }
    int f1(){	//判断辅音段的个数 
    	int ans=0;
    	for(;i<s.size();++i)
    		if(judeg(s[i])==false)
    			ans++; 
    		else break;
    	return ans;
    }
    int f2(){	//判断元音段的个数
    	int ans=0;
    	for(;i<s.size();i++)
    		if(judeg(s[i])==true)
    			ans++; 
    		else break;
    	return ans;
    }
    int main(){
    	cin>>s;
    	if(f1()>0 && f2()>0 && f1()>0 && f2()>0 && i==s.size())
    		printf("yes
    ");
    	else printf("no
    ");//短路性质
    	return 0; 
    }
    

    08 草地题

    问题描述
      小明有一块空地,他将这块空地划分为 n 行 m 列的小块,每行和每列的长度都为 1。
      小明选了其中的一些小块空地,种上了草,其他小块仍然保持是空地。
      这些草长得很快,每个月,草都会向外长出一些,如果一个小块种了草,则它将向自己的上、下、左、右四小块空地扩展,这四小块空地都将变为有草的小块。
      请告诉小明,k 个月后空地上哪些地方有草。
    输入格式
      输入的第一行包含两个整数 n, m。
      接下来 n 行,每行包含 m 个字母,表示初始的空地状态,字母之间没有空格。如果为小数点,表示为空地,如果字母为 g,表示种了草。
      接下来包含一个整数 k。
    输出格式
      输出 n 行,每行包含 m 个字母,表示 k 个月后空地的状态。如果为小数点,表示为空地,如果字母为 g,表示长了草。
    样例输入
    4 5
    .g...
    .....
    ..g..
    .....
    2
    样例输出
    gggg.
    gggg.
    ggggg
    .ggg.
    评测用例规模与约定
      对于 30% 的评测用例,2 <= n, m <= 20。
      对于 70% 的评测用例,2 <= n, m <= 100。
      对于所有评测用例,2 <= n, m <= 10001 <= k <= 1000。
    思考
    	这道题是BFS,考试的时候没做出来!后期没去想,所以代码……也是参考,看不大懂,先记着。
    
    #include<bits/stdc++.h>
    using namespace std;
    const int N = 1e3+3;
    int n,m,k;
    char g[N][N];
    int pos[4][2]={{1,0},{-1,0},{0,1},{0,-1}};//移动方向
    struct Node
    {
    	int x,y;
    	Node(int x,int y):x(x),y(y){}
    	Node(){}
    };
    
    queue<Node> pre;//初始访问
    queue<Node> _next;//下次访问
    
    void bfs(){
    	int xx,yy;
    	Node node; 
    	for(int i=0;i<k;++i){
    		
    		while(!pre.empty()){
    			node=pre.front();
    			pre.pop();
    			for(int j=0;j<4;++j){
    				xx = node.x+pos[j][0];
    				yy = node.y+pos[j][1];
    				if(xx>=0&&xx<n&&yy>=0&&yy<=m&&g[xx][yy]=='.'){
    					g[xx][yy]='g';
    					_next.push(Node(xx,yy));
    				}
    			}
    		}
    		while(!_next.empty()){
    			pre.push(_next.front());
    			_next.pop();
    		}
    	}
    }
    int main(){
    	std::ios::sync_with_stdio(false);
    	cin.tie(0);//关闭输入同步流
    	cin>>n>>m;
    	for(int i=0;i<n;++i){
    		for(int j=0;j<m;++j){
    			cin>>g[i][j];
    			if(g[i][j]=='g')pre.push(Node(i,j));
    		}
    	}
    	cin>>k;
    	bfs();
    	for(int i=0;i<n;++i){
    		for(int j=0;j<m;++j)cout<<g[i][j];
    		cout<<"
    ";
    	}
    	return 0;
    }
    

    09数列

    问题描述
      小明想知道,满足以下条件的正整数序列的数量:
      1. 第一项为 n;
      2. 第二项不超过 n;
      3. 从第三项开始,每一项小于前两项的差的绝对值。
      请计算,对于给定的 n,有多少种满足条件的序列。
    输入格式
      输入一行包含一个整数 n。
    输出格式
      输出一个整数,表示答案。答案可能很大,请输出答案除以10000的余数。
    样例输入
    	4
    样例输出
    	7
    样例说明
      以下是满足条件的序列:
      4 1
      4 1 1
      4 1 2
      4 2
      4 2 1
      4 3
      4 4
    评测用例规模与约定
      对于 20% 的评测用例,1 <= n <= 5;
      对于 50% 的评测用例,1 <= n <= 10;
      对于 80% 的评测用例,1 <= n <= 100;
      对于所有评测用例,1 <= n <= 1000。
    思考
    	不知道对不对,反正按题写就对了,别人的代码不知道为什么会那么长…………
    
    #include <stdio.h>
    int ans=0;
    int cmp(int a,int b){
    	int i,z=abs(a-b);	//z为第三项 
    	ans++;
    	if(ans>10000)
    		ans -= 10000;
    	for(i=1;i<z;i++){
    		cmp(b,i);	//第二项与第三项 
    	}
    }
    int main(){
    	int i,n;
    	scanf("%d",&n);
    	for(i=1;i<=n;i++)
    		cmp(n,i);	//第一项与第二项 
    	printf("%d
    ",ans);
    }
    

    10节目数

    问题描述
      小明要组织一台晚会,总共准备了 n 个节目。然后晚会的时间有限,他只能最终选择其中的 m 个节目。
      这 n 个节目是按照小明设想的顺序给定的,顺序不能改变。
      小明发现,观众对于晚上的喜欢程度与前几个节目的好看程度有非常大的关系,他希望选出的第一个节目尽可能好看,在此前提下希望第二个节目尽可能好看,依次类推。
      小明给每个节目定义了一个好看值,请你帮助小明选择出 m 个节目,满足他的要求。
    输入格式
      输入的第一行包含两个整数 n, m ,表示节目的数量和要选择的数量。
      第二行包含 n 个整数,依次为每个节目的好看值。
    输出格式
      输出一行包含 m 个整数,为选出的节目的好看值。
    样例输入
    5 3
    3 1 2 5 4
    样例输出
    3 5 4
    样例说明
      选择了第1, 4, 5个节目。
    评测用例规模与约定
      对于 30% 的评测用例,1 <= n <= 20;
      对于 60% 的评测用例,1 <= n <= 100;
      对于所有评测用例,1 <= n <= 1000000 <= 节目的好看值 <= 100000。
    思考
    	一道老题,写过但~~~~~~忘了,所以,考试没写出来,代码是参考的。https://www.cnblogs.com/transmigration-zhou/p/12539981.html
    
    #include<bits/stdc++.h>
    using namespace std;
    const int N=100010;
    bool cmp(int x,int y){
        return x>y;
    }
    int a[N],b[N],p[N];
    int main(){
        int n,m;
        cin>>n>>m;
        for(int i=0;i<n;i++){
            scanf("%d",&a[i]);
            b[i]=a[i];
        }
        sort(b,b+n,cmp);
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++)
            if(b[i]==a[j]){
                p[i]=j;
                break;
            }
        }
        sort(p,p+m);
        for(int i=0;i<m;i++){
            if(i==m-1) printf("%d",a[p[i]]);
            else printf("%d ",a[p[i]]);
        }   
        return 0;
    }
    

    整次考试,只做了7道题,没有很好的解答出,还是我太菜了。比如BFS、DFS解法运用不是很纯熟,暴力的话,我还是希望能不用就不用,毕竟代码的健壮性要保证!!!!!

    欢迎查阅
  • 相关阅读:
    java基础部分的一些有意思的东西。
    antdvue按需加载插件babelpluginimport报错
    阿超的烦恼 javaScript篇
    .NET E F(Entity Framework)框架 DataBase First 和 Code First 简单用法。
    JQuery获得input ID相同但是type不同的方法
    gridview的删除,修改,数据绑定处理
    jgGrid数据格式
    Cannot read configuration file due to insufficient permissions
    Invoke action which type of result is JsonResult on controller from view using Ajax or geJSon
    Entity model数据库连接
  • 原文地址:https://www.cnblogs.com/gh110/p/12561829.html
Copyright © 2011-2022 走看看