zoukankan      html  css  js  c++  java
  • 第十一届蓝桥杯B组省赛第二场

    这届是我第一次参加蓝桥杯,只拿了个省三,说实话,我的很多水平没发挥出来,看到结果后我也特别难受,我甚至怀疑自己是不是白训练了,找了很多算法大佬谈话。。还是做得题太少了吧,
    再加上个人特别要强,所以对这个结果难以接受。我在此决定强迫自己每天都写一篇博客,每天都练习算法,一定要在来年三月挺进国赛!!!
    毫不掩饰,我比赛的时候 C、D、E、F题都错了 , F题把我看懵逼了,好简单呀。。我用了强制类型转换,结果出来负数,我看了半天都搞不懂哪里错了,我觉得自己很对,然后就交了,实际上大佬
    跟我说强制类型转换容易出各种小问题,也算是长知识了吧。 C、D两题是真的就错的挺离谱的 , 原因是第一自己打代码还是不够稳,第二还是自己太粗心,以后会加以改正!
    会继续努力,继续扬帆起航,不为一次比赛而放弃追梦的路!
    下面来复盘一下比赛:

    试题A 门牌制作
    【问题描述】
    小蓝要为一条街的住户制作门牌号。
    这条街一共有 2020 位住户,门牌号从 1 到 2020 编号。
    小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最后根据需要将字
    符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、7,即需要 1 个
    字符 0,2 个字符 1,1 个字符 7。
    请问要制作所有的 1 到 2020 号门牌,总共需要多少个字符 2?
    【答案提交】
    这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
    个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
    题解:
    答案:624

    //这是一道简单题,遍历一下看每一位数是不是2即可。
    #include<iostream>
    
    using namespace std;
    
    int res ;
    
    int main(){
    	for(int i = 1 ; i <= 2020 ; i ++){
    		int j = i;
    		while(j){
    			if(j % 10 == 2) res ++;
    			j /= 10;
    		}
    	}
    	cout << res;
    	return 0;
    }
    

    B 既约分数
    【问题描述】
    如果一个分数的分子和分母的最大公约数是 1,这个分数称为既约分数。
    例如,34 , 52 , 18 , 71 都是既约分数。
    请问,有多少个既约分数,分子和分母都是 1 到 2020 之间的整数(包括 1 和 2020)?
    【答案提交】
    这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个
    整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
    题解:
    答案:2481215

    //求最大公约数问题
    #include<bits/stdc++.h>
    
    using namespace std;
    
    long long res;
    
    int gcd(int x , int y){
    	int ans;
    	if(x < y) swap(x , y);
    	while(1){
    		int t = x % y;
    		x = y;
    		y = t;
    		if(t == 0) break;
    	} 
    	return x;
    }
    int main(){
    	for(int i = 1; i <= 2020 ; i ++){
    		for(int j = 1 ; j <= 2020 ; j ++){
    			if(gcd(i , j) == 1) res ++;
    		}
    	}
    	cout << res ;
    	return 0;
    }
    

    试题 C: 蛇形填数
    【问题描述】
    如下图所示,小明用从 1 开始的正整数“蛇形”填充无限大的矩阵。
    1 2 6 7 15 ...
    3 5 8 14 ...
    4 9 13 ...
    10 12 ...
    11 ...
    ...
    容易看出矩阵第二行第二列中的数是 5。请你计算矩阵中第 20 行第 20 列
    的数是多少?
    【答案提交】
    这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
    个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
    题解:
    答案:761
    比赛的时候整个人都傻了,没发现规律,还是经验不足。。
    赛后重新看了一下这个题,发现还是很简单的(此时想打自己。。)
    首先每个对角线上的数字总数是以等差为1,首项为1递增的等差数列。
    其次可以观察推导出,每个(x,x)列的数都在第(2*x - 1)个对角线上,且该对角线的元素个数为奇数个,即我们所求元素为对角线上所有数的平均数。
    所以(20,20)列对应的数在第39个对角线上。 通过等差数列前n项和计算公式得前38对角线元素个数为741,前39对角线个数为780
    所以可以得知: 第39对角线的元素是从742到780之间的数,求他们的平均值即可。

    #include<bits/stdc++.h>
    
    using namespace std;
    
    long long sum;
    int main(){
    	for(int i = 742 ; i <= 780 ; i ++){
    		sum += i;
    	}
    	sum /= 39;
    	cout << sum;
    	
    	return 0;
    } 
    

    试题 D: 跑步锻炼
    【问题描述】
    小蓝每天都锻炼身体。
    正常情况下,小蓝每天跑 1 千米。如果某天是周一或者月初(1 日),为了
    激励自己,小蓝要跑 2 千米。如果同时是周一或月初,小蓝也是跑 2 千米。
    小蓝跑步已经坚持了很长时间,从 2000 年 1 月 1 日周六(含)到 2020 年
    10 月 1 日周四(含)。请问这段时间小蓝总共跑步多少千米?
    【答案提交】
    这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
    个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
    题解:8879
    说实话,这道题本人做的时候比起多数人用Excel和查表,本人写的代码做的,但是我忽略了闰年这个操作(我都想扇自己QwQ)
    这道题,就注意一些情况的考虑就行了,没什么难度。

    //D 跑步锻炼 
    #include<bits/stdc++.h>
    
    using namespace std;
    
    int res , week = 6;
    
    int flag ;
    
    int mon[13] = {-1 , 31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31};
    
    int main(){
    	int y , m , d;
    	cin >> y >> m >> d;
    	for(int i = 2000 ; i <= y ; i ++){
    		for(int j = 1 ; j <= 12 ; j ++){
    			int sum = mon[j];
    			if(((i % 4 == 0 && i % 100 != 0) || i % 400 == 0) && (j == 2)) sum ++;
    			for(int k = 1 ; k <= sum ; k ++){
    				res ++;
    				if(k == 1 || week == 1) res ++;
    				if(++ week == 8) week = 1;
    				if(i == y && j == m && k == d){
    					flag = 1;
    					break;
    				} 
    			}
    			if(flag) break;
    		}
    	}
    	cout << res;
    	return 0;
    }
    

    试题 E: 七段码

    【问题描述】
    小蓝要用七段码数码管来表示一种特殊的文字。
    上图给出了七段码数码管的一个图示,数码管中一共有 7 段可以发光的二
    极管,分别标记为 a, b, c, d, e, f, g。
    小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符
    的表达时,要求所有发光的二极管是连成一片的。
    例如:b 发光,其他二极管不发光可以用来表达一种字符。
    例如:c 发光,其他二极管不发光可以用来表达一种字符。这种方案与上
    一行的方案可以用来表示不同的字符,尽管看上去比较相似。
    例如:a, b, c, d, e 发光,f, g 不发光可以用来表达一种字符。
    例如:b, f 发光,其他二极管不发光则不能用来表达一种字符,因为发光
    的二极管没有连成一片。
    请问,小蓝可以用七段码数码管表达多少种不同的字符?
    【答案提交】
    这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
    个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
    题解:
    答案:80
    这道题比赛的时候本人是真的没想到dfs来做,还是做得题太少了。。得更努力。
    这道题是dfs的应用,关键点在于寻找不重复的路径,在此运用了set集合这个内部用红黑树实现的STL库。

    #include<bits/stdc++.h>
    
    using namespace std;
    //用于字符排序 
    char r[8];
    //用于存储总的路径数 
    int ans;
    //用于表示当前点的状态 
    int st[3][3];
    //用于描述点的值 
    char a[3][3]={{'a','b',''},{'f','g','c'},{'','e','d'}};
    //用于上下左右移动 
    int dx[] = {-1 , 1 , 0 , 0};
    int dy[] = {0 , 0 , -1 , 1};
    
    //用于去重 
    set<string> t;
    
    //用于删除空格,并将字符排序 
    void deletespace(string ss){
    	for(int i = 0 ; i < 8 ; i ++){
    		r[i] = '';
    	}
    	int m = 0 ;
    	for(int i = 0 ; i < ss.size() ; i ++){
    		if(ss[i] != '')
    			r[m ++] = ss[i];
    	}
    	sort(r , r + m);
    }
    //用于搜索全部路径
    //x,y用于存放当前点的坐标
    //ss用于记录当前路径 
    void dfs(int x,int y,string ss){
    	st[x][y] = 1;
    	for(int i = 0 ; i < 4 ; i ++){
    		int xx = x + dx[i];
    		int yy = y + dy[i];
    		if(xx >= 0 && xx <= 2 && yy >= 0 && yy <= 2 && !st[xx][yy]){
    			ans ++;
    			
    			deletespace(ss + a[xx][yy]);
    			t.insert(r);
    			dfs(xx , yy , r);
    		}
    	}
    	st[x][y] = 0;
    }
    int main(){
    	//整体思路讲解
    	//1.从每个点都要出发一次
    	//2.ans表示路径数 ss表示当前路径字符串 
    	//3.deletespace可以删除当前路径字符串中的'',同时将字符串内部从小到大排序,存储在char r[8];中 
    	//4.将处理完后的字符串保存到集合中,因为集合具有自动去重功能 
    	//5.输出集合大小,即为路径总数 
    	for(int i = 0 ; i < 3 ; i ++){
    		for(int j = 0 ; j < 3 ; j ++){
    			if(a[i][j] != ''){
    			ans ++;
    			string ss = "";
    			ss += a[i][j];
    			deletespace(ss);
    			t.insert(r);
    			dfs(i , j , r);
    		}
    	}
    }
    	cout<<"总路径数:"<<t.size()<<endl;
    	cout << "所有路径如下:"  << endl;
    	for(set<string>::iterator it = t.begin() ; it != t.end() ; it ++) cout << *it << endl;
    	
    	return 0;
    } 
    

    到此填空题就完了hhh

  • 相关阅读:
    HDOJ 4747 Mex
    HDU 1203 I NEED A OFFER!
    HDU 2616 Kill the monster
    HDU 3496 Watch The Movie
    Codeforces 347A A. Difference Row
    Codeforces 347B B. Fixed Points
    Codeforces 372B B. Hungry Sequence
    HDU 1476 Sudoku Killer
    HDU 1987 How many ways
    HDU 2564 词组缩写
  • 原文地址:https://www.cnblogs.com/ZhaoHaoFei/p/13884056.html
Copyright © 2011-2022 走看看