2020十月蓝桥杯B组省赛

2020十月蓝桥杯B组省赛

    • 蓝桥的背景
    • 试题 A: 门牌制作
    • 试题 B: 既约分数
    • 试题 C: 蛇形填数
    • 试题 D: 跑步锻炼
    • 试题 E: 七段码
    • 试题 F: 成绩统计
    • 结束赠言:
    • 既然选择了远方,何必在乎结局是否抵达,至少心驰神往过,至少摧残精彩过--------赠现在还在变强的小舟上苦苦挣扎的你

蓝桥的背景

蓝桥杯为大学生IT学科赛事,由工业和信息化部人才交流中心主办。

为推动软件开发技术的发展,促进软件专业技术人才培养,向软件行业输送具有创新能力和实践能力的高端人才,提升高校毕业生的就业竞争力,全面推动行业发展及人才培养进程,工业和信息化部人才交流中心特举办“全国软件专业人才设计与创业大赛”,大赛包括个人赛和团队赛两个比赛项目。

个人赛设置:C/C++程序设计(本科A组、本科B组、高职高专组);Java软件开发(本科A组、本科B组、高职高专组);嵌入式设计与开发(大学组、研究生组);单片机设计与开发(大学组);电子设计与开发(大学组),团队赛设置:软件创业赛一个科目组别。

下面是2020十月蓝桥杯B组省赛题目和部分题解

试题 A: 门牌制作

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

public class A {

	public static void main(String[] args) {
		 int sum=0;
		for(int i=1;i<=2020;i++){
			String s=i+"";//将数字转化成字符
			for(int j=0;j<s.length();j++){
				if(s.charAt(j)==2+'0'){
					sum++;
				}
				
			}
		}System.out.println(sum);
		
	}
}

答案:624

试题 B: 既约分数

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

张菜菜的思想是两层for循环,求 i 和 j 的最大公约数即可。

代码如下:

public class B {

	public static void main(String[] args) {
		int sum=0;
		for(int i=1;i<=2020;i++){
			for(int j=1;j<=2020;j++){
				if(i>=j&&gcd(i,j)==1){
					sum++;
				}
				else if(i<j&&gcd(i,j)==1){
					sum++;
				}
			}
		}
		System.out.println(sum);

	}
	public static int gcd(int a,int b){
		
		return b==0?a:gcd(b,a%b);
	}
}

答案:2481215

试题 C: 蛇形填数

本题总分:10 分
【问题描述】
如下图所示,小明用从 1 开始的正整数“蛇形”填充无限大的矩阵。
1 2 6 7 15 …
3 5 8 14 …
4 9 13 …
10 12 …
11 …

(1)
容易看出矩阵第二行第二列中的数是 5。请你计算矩阵中第 20 行第 20 列
的数是多少?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
试题 C: 蛇形填数 4

这里模拟了一遍添加数的过程:
不过要思考的是定义数组的大小,求20行20列,最小数组是40行40列。
代码如下:

public class C {
	static int a[][]=new int [42][42];
	public static void main(String[] args) {
		int tmp=1;
		for(int i=1;i<=41;i++){
			if(i%2!=0){
				for(int x=1,y=i;x>0&&y>0;x++,y--)
					a[x][y]=tmp++;
			}
			else{
				for(int x=i,y=1;x>0;x--,y++){
					a[x][y]=tmp++;
				}
			}
		}
		System.out.println(a[20][20]);
	}
}

试题 D: 跑步锻炼

本题总分:10 分
【问题描述】
小蓝每天都锻炼身体。
正常情况下,小蓝每天跑 1 千米。如果某天是周一或者月初(1 日),为了
激励自己,小蓝要跑 2 千米。如果同时是周一或月初,小蓝也是跑 2 千米。
小蓝跑步已经坚持了很长时间,从 2000 年 1 月 1 日周六(含)到 2020 年10 月 1 日周四(含)。请问这段时间小蓝总共跑步多少千米?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

主要思路:判断闰年与否得出2月天数,日增加的极限,月也要增加,月增加的极限是年的变化。
代码:

#include<bits/stdc++.h> 
using namespace std;
int maxn = 100001;
int inf = 0x3fffffff; 
//判断闰年函数 
bool isRun(int y){
	if(( y%100!=0 && y%4==0) || y%400==0  )
		return true;
	return false;
}

int main(){
	
	int sum=0;
	int year=2000,month=1,day=1;
	int week=6;
	
	sum = sum + 2;
	
	for(int i=1;i<=7579;i++){
 
 		day++;
		week++;
 		
 		if( day==31 && (month==4||month==6||month==9||month==11 ) ){
			
			day=1;
			month++;
 
		}
		else if( day==32 && (month==1||month==3||month==5||month==7||month==8||month==10||month==12) ){
			
			day=1;
			month++;
			
		}
		
		else if(month==2){
		
			if(day==30 && isRun(year)==true){//29
				day=1;
				month++;
				
			}else if(day==29 && isRun(year)==false){//28
				
				day=1;
				month++;
			}
		}
		
		
		if(month==13){
				
			month=1;
			year++;
		}
		if(week==8) week=1;
		if(day==1||week==1) sum=sum+2;
		else sum++;
		//这个地方可以对年和月进行输出实时测试 
		if(year==2020 && month==10 && day==1) 
			break;	
	}
	cout<<sum;	
	return 0;
}

答案:8879

试题 E: 七段码

本题总分:15 分
【问题描述】
小蓝要用七段码数码管来表示一种特殊的文字。
上图给出了七段码数码管的一个图示,数码管中一共有 7 段可以发光的二
极管,分别标记为 a, b, c, d, e, f, g。
小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符
的表达时,要求所有发光的二极管是连成一片的。
例如:b 发光,其他二极管不发光可以用来表达一种字符。
例如:c 发光,其他二极管不发光可以用来表达一种字符。这种方案与上
一行的方案可以用来表示不同的字符,尽管看上去比较相似。
例如:a, b, c, d, e 发光,f, g 不发光可以用来表达一种字符。
例如:b, f 发光,其他二极管不发光则不能用来表达一种字符,因为发光
的二极管没有连成一片。
请问,小蓝可以用七段码数码管表达多少种不同的字符?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

答案:80

试题 F: 成绩统计

时间限制: 1.0s 内存限制: 256.0MB 本题总分:15 分
【问题描述】
小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是
一个 0 到 100 的整数。
如果得分至少是 60 分,则称为及格。如果得分至少为 85 分,则称为优秀。
请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整
数。
【输入格式】
输入的第一行包含一个整数 n,表示考试人数。
接下来 n 行,每行包含一个 0 至 100 的整数,表示一个学生的得分。
【输出格式】
输出两行,每行一个百分数,分别表示及格率和优秀率。百分号前的部分
四舍五入保留整数。
【样例输入】

7
80
92
56
74
88
100
0

【样例输出】
71%
43%
【评测用例规模与约定】
对于 50% 的评测用例,1 ≤ n ≤ 100。
对于所有评测用例,1 ≤ n ≤ 10000

编程题目签到题:

#include <iostream>
using namespace std;
//这就是一个简单的四舍五入函数 
double RoundEx(const double& dInput)
{
    double dIn = dInput;
    if (dInput >= 0.0)    //???
    {
        return int(dIn + 0.5);
    } 
    else
    {
        return int(dIn - 0.5);
    }
}
int main()
{
	int n; 
	cin >> n;
	double pass=0,exc=0;
	for(int i=1;i<=n;i++)
	{
		int x; cin >> x;
		if( x>=60 )	pass+=100;
		if( x>=85 )	exc+=100;
	}
	pass/=n; exc/=n;
	cout << RoundEx(pass) << "%\n";
	cout << RoundEx(exc) << "%";
}

结束赠言:

**

既然选择了远方,何必在乎结局是否抵达,至少心驰神往过,至少摧残精彩过--------赠现在还在变强的小舟上苦苦挣扎的你

**

你可能感兴趣的:(ACM,算法总结,ACM基础,java)