第八届蓝桥杯题型简介:
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