第十届 蓝桥杯C/C++ B组省赛(2019)

试题A 组队

在这里插入图片描述在这里插入图片描述
解题思路

每个位置尽可能选择分数高的,注意不要一个人选两次!

试题B 年号字串

在这里插入图片描述

AC代码

BYQ
#include <stdio.h>
#define N 2019


void fun(){
	int i , j , k;
	int ans = 0;
	for(i = 0; i < 26; i++){ // 0 0 A
		for(j = 0; j < 26; j++){ // 0 A
			for(k = 1; k < 27; k++){ // A = 1
				ans += 1; 
				if(ans == 2019){
					printf("%d %d %d",i, j, k); 
					// 2 25 17  对应字母表 A 1 B 2...
					return;
				}
			}
		}

	} 
}

int main(){
	fun(); //利用函数密封
	return 0;
}

试题C 数列求和

在这里插入图片描述
解题思路

       类似斐波那契,注意每一步都求 mod。

AC代码

4659
#include <stdio.h>
#define mod 10000
int a[20190324]; //数组过大定义在外面 


int main(){
	a[0] = 1; a[1] = 1; a[2] = 1;
	
	for(int i = 3; i < 20190324; i++){
		a[i] = (a[i-1] + a[i-2] + a[i-3])%mod;  // %mod !
	}
	printf("%d", a[20190323]);
}

试题D 数的分解

在这里插入图片描述
解题思路:

	写两个函数,一个用来检查是否合法。

AC代码

40785
#include <string>
#include <iostream>
using namespace std;

int fun(int n){ //检查合法性
	while(n){
		int t = n%10;
		n = n/10;
		if(t == 2 || t == 4)
			return 0;
	}
	return 1;
}


int main(){
	int cnt = 0;
	for(int i = 1; i < 2019; i++){
		if(fun(i)){
			// j = i + 1 !!! 不同顺序是一种
			for(int j = i+1; j < 2019; j++){ 
				if(fun(j)){
					int z = 2019-i-j;
					if(fun(z) && z > j)  //z > j !!!同一种
						cnt++;					
				}
				else
					continue;				
			}			
		}
		else
			continue;
	}
	cout << cnt;
	return 0;
}

试题E 迷宫

试题F 特别数的和

在这里插入图片描述
在这里插入图片描述

AC代码

#include <stdio.h>
#include <iostream>
using namespace std;

int fun(int n){ //检查合法性
	while(n){
		int t = n%10;
		n /= 10;
		if(t == 2 || t == 0 || t == 1 || t == 9)
			return 1;
	}
	return 0;
}

int main(){
	int n, sum = 0;
	scanf("%d", &n);
	
	for(int i = 1; i < n+1; i++){
		if(fun(i))
			sum += i;
	}
	printf("%d", sum);
	return 0;
} 

试题G 完全二叉树的权值

试题H 等差数列

在这里插入图片描述
在这里插入图片描述

解题思路:

	先排序,两两相减,求出最小等差。然后 n = (an - a1) / d + 1,求出n。

AC代码

#include <stdio.h>
#include <algorithm>
#include <iostream>
using namespace std;

int arr[10000005];

int main(){
	int n;
	scanf("%d", &n);
	
	for(int i = 0; i < n; i++){
		scanf("%d", &arr[i]);
	}
	
	sort(arr, arr+n);
	int min = 10000000;
	for(int i = 0; i < n-1; i++){
		int t = arr[i+1] - arr[i];
		if(t < min)
			min = t; 
	}
	
	if(min == 0) // 考虑等差为0 !!!
		cout << n << endl;
	else
		cout << (arr[n-1] - arr[0])/min + 1 << endl;
	
	return 0;
} 

试题I 后缀表达式

试题J 灵能传输

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值