2019第十届蓝桥杯b组C++部分题目答案

试题 A:组队

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

答案:490

思路:直接手算(注意:1~5号位必须是编号不同的人)

试题 C:数列求值

本题总分:10分
【问题描述】
给定数列1,1,1,3,5,9,17,…,从第4项开始,每项都是前3项的和。求
第20190324项的最后4位数字。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个4位整数(提示:答案的千位不为0),在提交答案时只填写这个整数,填写
多余的内容将无法得分。

答案:4659

#include <iostream>
using namespace std;
int a[20190325]; // 数组较大时一般要写在主函数外
int main()
{
	int i;
	a[0]=a[1]=a[2]=1;
	for(i=3;i<20190324;i++)   {
		a[i]=a[i-1]+a[i-2]+a[i-3];
		a[i]%=10000; // 没有这句的话数据太大,因为只需求最后4位数字所以可以每次求完一个就取余		
	}
	cout<<a[20190323]%10000<<endl;
	return 0;
}

试题 D:数的分解

本题总分:10分
【问题描述】
把 2019分解成 3个各不相同的正整数之和,并且要求每个正整数都不包
含数字2和4,一共有多少种不同的分解方法?
注意交换 3个整数的顺序被视为同一种方法,例如 1000+1001+18和
1001+1000+18被视为同一种。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

答案:40785 

#include <iostream>
using namespace std;
bool f(int n) 
{
	int t;
	while(n!=0) {
		t=n%10; // 先判断最后一位数(这里要加个变量t,没有则会让n改变,后面无法判断)
		if(t!=2&&t!=4) n/=10;
		else break;	 
	}
	if(n==0) return 1;
	else return 0;
} 
int main()
{
	int a[2020],i,j=0,k,p=0,ans=0;
    // 要先筛选符合条件的放于数组中,否则不能输出!
	for(i=1;i<2018;i++) {
		if(f(i)) {
			a[j++]=i;
			p++;
		}
	}
	for(i=0;i<p;i++)
	  for(j=i+1;j<p;j++)
	    for(k=j+1;k<p;k++) {
	   	  if(((a[i]!=a[j])&&(a[i]!=a[k])&&(a[j]!=a[k]))&&((a[i]+a[j]+a[k])==2019)) ans++;
	    }
	cout<<ans<<endl;	
	return 0;
}

当时没有想到可以直接除法取数...

试题 F:特别数的和

时间限制: 1.0s内存限制: 256.0MB本题总分:15分
【问题描述】
小明对数位中含有 2、0、1、9的数字很感兴趣(不包括前导 0),在1到
40中这样的数包括1、2、9、10至32、39和40,共28个,他们的和是574。
请问,在1到n中,所有这样的数的和是多少?
【输入格式】
输入一行包含两个整数n。
【输出格式】
输出一行,包含一个整数,表示满足条件的数的和。
【样例输入】
40
【样例输出】
574
【评测用例规模与约定】
对于20%的评测用例,1≤n≤10。
对于50%的评测用例,1≤n≤100。
对于80%的评测用例,1≤n≤1000。
对于所有评测用例,1≤n≤10000。

#include <iostream>
using namespace std;
bool f(int n) 
{
	int t;
	while(n) {
		t=n%10; // 先判断最后一位数(这里要加个变量t,没有则会让n改变,后面无法判断)
		if(t==2||t==0||t==1||t==9) {
			return 1; continue;
		}
		n/=10; 
	}
	if(n==0) return 0;
} 
int main()
{
	int i,n,ans=0;  cin>>n;
	for(i=1;i<=n;i++) {
		if(f(i)) ans+=i;		
	}
	cout<<ans<<endl;		
	return 0;
}

试题 H:等差数列

时间限制: 1.0s内存限制: 256.0MB本题总分:20分
【问题描述】
数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一
部分的数列,只记得其中N个整数。
现在给出这 N个整数,小明想知道包含这 N个整数的最短的等差数列有
几项?
【输入格式】
输入的第一行包含一个整数N。
第二行包含 N个整数 A1,A2,···,AN。(注意 A1 ∼AN并不一定是按等差数
列中的顺序给出)
【输出格式】
输出一个整数表示答案。
【样例输入】
5
2641020
【样例输出】
10
【样例说明】
包含2、6、4、10、20的最短的等差数列是2、4、6、8、10、12、14、16、
18、20。
【评测用例规模与约定】
对于所有评测用例,2≤N≤100000

#include <iostream>
#include <algorithm>
using namespace std;

int a[100001];
int main()
{
	int n,i,ans; cin>>n;
	for(i=0;i<n;i++) cin>>a[i];
	sort(a,a+n); 头文件为 #include <algorithm>
	int d=a[1]-a[0],max=a[0],min=a[0]; // d为公差
	
	for(i=1;i<n-1;i++) {
		if(a[i+1]-a[i]<d) d=a[i+1]-a[i];	
	}
	for(i=1;i<n;i++) {
		if(a[i]>max) max=a[i];
		if(a[i]<min) min=a[i];
	}
	cout<<(max-min)/d+1<<endl;
		
	return 0;
}

总结:思考时是一个深入的过程,当发现一直做不出来时,尝试换种思路,从头开始。

猜你喜欢

转载自blog.csdn.net/qq_42458302/article/details/89343973
今日推荐