2017【第八届蓝桥杯初赛】 C/C++ B组

第八届蓝桥杯题型简介:

6个填空题,直接输出结果即可,无需其他输入输出 否则算错,只有满分和0分之分 

4个编程题,需要输入测试数据,根据通过的样例数来评分 

填空题:

1.购物单

这个题是真的暴力,那么多数据一个个输入就麻烦了,还可能出错,使用编辑器的快速替换处理一下改为一个输入的求解的问题就OK了                                               ans=5200

2.等差素数列

炒鸡暴力的枚举,先把素数全部筛出来(直接判断也行),枚举一下公差,再枚举首项,判断一下能否连续10个都符合条件,找到最后结果                                        ans=210  +code

3.承压计算

一看那么多数据,肯定又是暴力,这是一个杨辉三角类似物,不同的是头上的重量会均分给两只脚,一直传达到最下面的30个电子秤

这道题涉及到一个公式的转换  重量/示数=进制,一上来没弄明白给那个数是啥意思。。。再就是输出的时候使用printf找到double值,使用cout会自动使用科学计数法,最后的输出是一个整数!!!                       ans=72665192664  +code

4.方格分割

这道题放在这里真是难为人,出题人太huai了,没做出来,待更新。。。

5.取数位

求1个整数的第k位数字有很多种方法。
以下的方法就是一种。

求x用10进制表示时的数位长度 
int len(int x){
    if(x<10) return 1;
    return len(x/10)+1;
}    
// 取x的第k位数字
int f(int x, int k){
    if(len(x)-k==0) return x%10;
    return _____________________;  //填空
}   
int main()
{
    int x = 23574;
    printf("%d\n", f(x,3));
    return 0;
}
// 对于题目中的测试数据,应该打印5。
// 请仔细分析源码,并补充划线部分所缺少的代码。
// 注意:只提交缺失的代码,不要填写任何已有内容或说明性的文字。

一个简单的递归公式的递推,每次截掉后面多余的数位即可      ans : f(x/10,k)   

6.最大公共子串

标题:最大公共子串
最大公共子串长度问题就是:
求两个串的所有子串中能够匹配上的最大长度是多少。
比如:"abcdkkk" 和 "baabcdadabc",
可以找到的最长的公共子串是"abcd",所以最大公共子串长度为4。
下面的程序是采用矩阵法进行求解的,这对串的规模不大的情况还是比较有效的解法
请分析该解法的思路,并补全划线部分缺失的代码。

#include <stdio.h>
#include <string.h>
#define N 256
int f(const char* s1, const char* s2)
{
	int a[N][N];
	int len1 = strlen(s1);
	int len2 = strlen(s2);
	int i,j;
	memset(a,0,sizeof(int)*N*N);
	int max = 0;
	for(i=1; i<=len1; i++)
		for(j=1; j<=len2; j++)
			if(s1[i-1]==s2[j-1]) {
				a[i][j] = __________________________;  //填空
				if(a[i][j] > max) max = a[i][j];
			}
	return max;
}
 
int main()
{
	printf("%d\n", f("abcdkkk", "baabcdadabc"));
	return 0;
}

看清楚了,这是子串,不是子序列。。谈不上是一个动态规划问题,就当是直接暴力吧  ans:a[i-1][j-1]+1

编程题:

7.日期问题

题目不是很难,但是非常的麻烦,首先枚举一下可能成功的三种情况,枚举的过程中不要忘了判断闰年,然后输出的顺序还要按照时间从先到后,需要输出的格式也不要忘了。。。

提供两组测试数据                        满分code

01/01/01
00/02/29

8.包子凑数

训练系统里面有一个题是 给你两个数,求最大凑不成的数,这个是求凑不成的数的个数,但是这个数据是多个,求法很类似。

题目中要求可能有无数个凑不出来的数,什么意思呢?其实这里就需要保证 这些数必须互质(不是两两互质。。)所有数的最大公约数gcd 需要等于1,因为不是gcd的倍数都凑不出来(裴蜀定理:对于整数a,b,他们关于x,y的线性不定方程ax+by=d,设gcd(a,b)=g,则可证明g|d,换句话说,就是g是a,b的最小线性组合

剩下就是一个递推,也有人说是个完全揹包。。。用个数组标记可否凑成                 满分code

9.分巧克力

这就是一个分pie问题,使用二分直接锤就行,需要注意的一点就是因为要分成正方形,一个矩形可以分成的正方形的个数可不是简单的面积相除哦 ~~~                              满分code

10.k倍区间

这道题有点意思,第一想法还是暴力,哈哈哈哈,但是铁定过不了,也就是想想吧

既然是区间的和,还那么多区间,自然就会想到 前缀和 喽,但是只用前缀和还是不够的。我们知道区间 i~j 的区间和是 sum[j]-sum[i-1],看另一个公式 (a-b)%k==0  <->  a%k-b%k==0  <->  a%k=b%k,这就说明了如果区间和模k==0只需要使得区间两端的sum模k相等即可,由于求和是不影响取模运算的,所以我们可以使用  sum数组存前缀和对k取模的结果,  然后使用cnt数组记录模k的所有的结果的个数,最后的结果就是cnt[0]+所有取模的结果的两两组合的数量(1+2+...+n-1)可以推一下      满分code

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章