【备战蓝桥】 算法·每日一题(详解+多解)-- day1

126 阅读6分钟

@[TOC](【备战蓝桥】 算法·每日一题(详解+多解)-- day1)

✨博主介绍

🌊 作者主页:苏州程序大白

🌊 作者简介:🏆CSDN人工智能域优质创作者🥇,苏州市凯捷智能科技有限公司创始之一,目前合作公司富士康、歌尔等几家新能源公司

💬如果文章对你有帮助,欢迎关注、点赞、收藏

💅 有任何问题欢迎私信,看到会及时回复 💅关注苏州程序大白,分享粉丝福利

什么是蓝桥杯

在这里插入图片描述 蓝桥杯全国软件和信息技术专业人才大赛是由中华人民共和国工业和信息化部人才交流中心主办,国信蓝桥教育科技(北京)股份有限公司承办的计算机类学科竞赛。

蓝桥杯全称蓝桥杯全国软件和信息技术专业人才大塞,是由工业和信息化部人才交流中心举办的全国性IT学科赛事,是高校教育教学改革和创新人才培养的重要竞赛项目。

随着信息化社会的加快,软件和信息技术逐渐成为我国的核心产业,因此推动软件和信息技术产业的发展,促进软件和信息技术专业技术人才的培养势在必行,蓝桥杯就是这样一个全面推动行业发展及人才培养进程的比赛。

蓝桥杯比赛项目分为个人赛软件类、个人赛电子类、青少年创意编程组、视觉设计大赛这几个部分,目前参赛学校已经超过1200多所,包括清华大学、上海交通大学等名校,取得了良好的社会反响。

第一题:

题目描述

数列求值 给定数列1, 1, 1, 3, 5, 9, 17, …,从第4 项开始,每项都是前3 项的和。 求第20190324 项的最后4 位数字。

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;

const LL N = 5e7;

LL arr[N];

int main() {
	arr[1] = 1, arr[2] = 1, arr[3] = 1;

	for(LL i = 4; i <= 20190324; i++){

		//我们只要后四位有效数字,所以取模10000即可 
		LL t = ((arr[i - 1] % 10000 + arr[i - 2] % 10000) % 10000 + 
		arr[i - 3] % 10000) % 10000;
		arr[i] = t;
	}
	cout << arr[20190324] << endl;

	return 0;
}

答案: 4659

第二题

题目描述:

完全二叉树的权值

给定一棵包含N 个节点的完全二叉树,树上每个节点都有一个权值,按从 上到下、从左到右的顺序依次是A1, A2, AN,如下图所示:

现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点 权值之和最大?如果有多个深度的权值和同为最大,请你输出其中最小的深度。 注:根的深度是1。

#include<bits/stdc++.h>
 
using namespace std;
typedef long long LL;
 
int main(){
	LL res = 0, n, k = 0, s = 0, ss = -5e10, m = 0;
	cin >> n;

	for(LL i = 1; i <= n; i++){
		int tmp;
		cin >> tmp;
		s += tmp;
		m ++;

		if(m == pow(2, k)){

			if(s > ss) {
				ss = s;
				res = k;

			}
			k ++;
			s = 0;
			m = 0;

		}

	}
    cout << res + 1 << endl;
    return 0;
}

第三题

题目描述:

组队

作为篮球队教练,你需要从以下名单中选出1 号位至5 号位各一名球员,组成球队的首发阵容。 每位球员担任1号位至5号位时的评分如下表所示。请你计算首发阵容1号位至5号位的评分之和最大可能是多少?

1 97 90 0 0 0 2 92 85 96 0 0 3 0 0 0 0 93 4 0 0 0 80 86 5 89 83 97 0 0 6 82 86 0 0 0 7 0 0 0 87 90 8 0 97 96 0 0 9 0 0 89 0 0 10 95 99 0 0 0 11 0 0 96 97 0 12 0 0 0 93 98 13 94 91 0 0 0 14 0 83 87 0 0 15 0 0 98 97 98 16 0 0 0 93 86 17 98 83 99 98 81 18 93 87 92 96 98 19 0 0 0 89 92 20 0 99 96 95 81

1 97 90 0 0 0 2 92 85 96 0 0 3 0 0 0 0 93 4 0 0 0 80 86 5 89 83 97 0 0 6 82 86 0 0 0 7 0 0 0 87 90 8 0 97 96 0 0 9 0 0 89 0 0 10 95 99 0 0 0 11 0 0 96 97 0 12 0 0 0 93 98 13 94 91 0 0 0 14 0 83 87 0 0 15 0 0 98 97 98 16 0 0 0 93 86 17 98 83 99 98 81 18 93 87 92 96 98 19 0 0 0 89 92 20 0 99 96 95 81

题解:

#include<bits/stdc++.h>
 
using namespace std;
typedef long long LL;
 
int main(){
	cout << 98 + 99 + 98 + 97 + 98 << endl;
    return 0;
}

第四题

题目描述:

年号字串

小明用字母A 对应数字1,B 对应2,以此类推,用Z 对应26。对于27以上的数字 小明用两位或更长位的字符串来对应,例如AA 对应27,AB 对应28,AZ 对应52,LQ 对应329。 请问2019 对应的字符串是什么?

#include<bits/stdc++.h>
 
using namespace std;
typedef long long LL;
 
int main(){
	int n = 2019;
	string s1 = "";
	while(n){
		int t = n % 26;

		s1 += char('A' + t - 1);
		n /= 26;
	}
	reverse(s1.begin(), s1.end());
	cout << s1 << endl;
    return 0;
}

第五题

题目描述:

数的分解

把2019分解成3个各不相同的正整数之和,并且要求每个正整数都不包含数字2和4,一共有多少种不同的分解方法? 注意交换3个整数的顺序被视为同一种方法,例如1000+1001+18 和1001+1000+18 被视为同一种。

#include<bits/stdc++.h>
 
using namespace std;

bool check(int n){
	while(n){
		int tmp = n % 10;
		if(tmp == 2 || tmp == 4) return false;
		n /= 10;
	}

	return true;
}
 
int main(){
	int res = 0;
	for(int i = 1; i <= 2019; i++){
		for(int j = i + 1; i + j <= 2019; j++){
			int k = 2019 - i - j;
			if(k > j && check(i) && check(j) && check(k)) res ++;
		}
	}

	cout << res << endl;
    return 0;
}

第六题

题目描述:

特别数的和

小明对数位中含有2、0、1、9 的数字很感兴趣(不包括前导0) 在1到40中这样的数包括1、2、9、10 至32、39 和40,共28 个,他们的和是574。 请问,在1到n 中,所有这样的数的和是多少?

#include<bits/stdc++.h>
 
using namespace std;

bool check(int n){
	while(n){
		int tmp = n % 10;
		if(tmp == 2 || tmp == 0 || tmp == 1 || tmp == 9)
			return true;
		n /= 10;
	}
	return false;
}
int main(){
	int m, res = 0;
	cin >> m;
	for(int i = 1; i <= m; i++){
		if(check(i)) res += i;
	}

	cout << res << endl;
    return 0;
}

第七题

题目描述:

等差数列

数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列,只记得其中N 个整数。 现在给出这N 个整数,小明想知道包含这N 个整数的最短的等差数列有几项?

#include<bits/stdc++.h>
 
using namespace std;

typedef long long LL;

vector<LL>arr;
int main(){
	LL n;
	cin >> n;
	for(LL i = 0; i < n; i++){
		LL tmp;
		cin >> tmp;
		arr.push_back(tmp);

	}

	sort(arr.begin(), arr.end());

	LL d = 0;
	for(LL i = 0; i < arr.size()-1; i++){
		d = __gcd(d, arr[i+1] - arr[i]);
	}
	if(arr[0] != arr[n-1]){
		cout << (arr[n-1] - arr[0]) / d + 1;
	}else{
		cout << n << endl;
	}
    return 0;
}