1、届蓝桥杯第1题:统计不含4的数字题目大意统计10000至99999中,不包含4的数值个数。解题分析:第一种解法: 数学方法,这种是在网上看到的一种解法:最高位除了0、4不能使用,其余8个数字(1,2,3,5,6,7,8,9)均能使用,剩下的四位(千位、百位、十位、个位) 可以使用除了4以外的所有数字,所以共有 8*9*9*9*9种解, 计算得答案为:52488。第二种解法: 暴力搜索方法,这个数字的位数共有5位因此,可以设置a, b, c, d, e,分别代表这5位。代码:#include #include using namespace std;int main() int a, b, c,
2、 d, e; int count = 0; for(a = 1; a = 9; a+) for(b = 0; b = 9; b+) for(c = 0; c = 9; c+) for(d = 0; d = 9; d+) for(e = 0; e = 9; e+) if(a != 4 & b != 4 & c != 4 & d != 4 & e !=4) count+; coutcountendl; return 0;输出为: 52488第2题:计算1千天后的日期题目大意2014-11-09再过1000天是哪一日?解题分析:我想这里题目,对于大家来说分析的时候难点就在于那年是闰年,那年是平年那么
3、从2014到2017年之间2016年是闰年,因此这一年就是365天,这道题,我是手算的。答案是: 2017-08-05重点是要按照格式提交。第3题:竖式加法题目大意祥 瑞 生 辉三 羊 献 瑞?三 羊 生 瑞 气题目用了8个不同的汉字,表示09里八种不同的数字。组成两个数值相加,等于第三个数值。求三羊献瑞”对应到数字是多少?解题分析:第一种暴力搜索:我假设结果中进位的是1,那么三对应的就是数字1.接下来定义变量。 a b c d+ 1 e f b-1 e c b g代码:这段代码输三个结果,把每个结果带进去试一下就知道那个是了。#include #include using namespace
4、 std;int main() int a, b, c, d, e, f, g; for(a = 1; a = 9; a+) for(b = 0; b = 9; b+) for(c = 0; c = 9; c+) for(d = 0; d = 9; d+) for(e = 0; e = 9; e+) for(f = 0; f = 9; f+) for(g = 0; g = 9; g+) if(a * 1000 + b * 100 + c * 10 + d) + (1000 + e * 100 + f * 10 + b) = (10000 + e * 1000 + c * 100 + b * 1
5、0 + g) if(a != 1 & b != 1 & c != 1 & d != 1 & e != 1 & f != 1) if(a != b & a != c & a != d & a !=e & a != f & a != g & b != c & b != d & b != e & b != f & b != g & c != d & c != e & c != f & c != g & d != e & d != f & d != g & e != f & e != g & f != g) cout1 * 1000 + e * 100 + f * 10 + bendl; return
6、 0;第二种解法:全排列方法:代码:#include #include #include using namespace std;int main() int a10; for(int i = 0; i = 9; i+) ai = i; do if(!a2 | !a6) continue; int x = a2 * 1000 + a3 * 100 + a4 * 10 + a5; int y = a6 * 1000 + a7 * 100 + a8 * 10 + a3; int z = a6 * 10000 + a7 * 1000 + a4 * 100 + a3 * 10 + a9; if(x +
7、 y = z) cout yendl; while(next_permutation(a, a + 10); return 0;= 代码填空=第4题:古怪的星号修饰符题目大意是道代码填空题,主要是完成一个字符串s,按宽度width截断后,在固定宽度为width,两边为符号|的居中输出。难点是题目给出了printf(“%*s%s%*s”,_),要求填printf的实参列表。这道题看的时候觉得有点坑,因为自己不懂printf(%*s %s %*s, );的意思,我开始还以为是指针那一块的。现在把网上的给大家分享:有些童鞋可能知道scanf里用*修饰符,是起到过滤读入的作用。比如一个有三列数值的数据
8、,我只想得到第2列数值,可以在循环里用scanf(“%*d%d%*d”, ai)来读入第i行的第2个数值到ai。* 修饰符在printf中的含义完全不同。如果写成printf(“%6d”, 123),很多童鞋应该就不会陌生了,这是设置域宽的意思。同理,%6s也是域宽。* 修饰符正是用来更灵活的控制域宽。使用%*s,表示这里的具体域宽值由后面的实参决定,如printf(“%*s”, 6, “abc”)就是把”abc”放到在域宽为6的空间中右对齐。明白了 * 是用变量来控制域宽,那么这题就简单了,这里应该填写5个实参。然后字符长度的计算应该用buf而不是s,因为buf才是截断后的长度,用s的话,如
9、果s长度超过了width-2,效果就不对了。类似使用说明的代码如下:#include #include #include using namespace std;int main() char s100 = abcd1234; char buf1000; int width = 20; strcpy(buf, s); bufwidth-2 = 0; printf(|%*s%s%*s|n, (width-strlen(buf)-2)/2, , buf, (width-strlen(buf)-2)/2, ); return 0;第5题:补充全排列的回溯算法题目大意1,2,39 这九个数字组成一个分
10、数,其值恰好为1/3,如何组法?与第3题一样可以用全排列暴力,但这题是代码填空题,且已经手写一部分全排列算法,我们负责补充其中一行代码。写全排就是用回溯的思想,直接猜到for循环里的第三行,应该就是把第一行的交换操作再交换回来复制for里的第一行代码,运行下程序,还不放心就调试下,看看数组是不是有按字典序在变化就行了。答案:t=xk; xk=xi; xi=t;= 填空=第6题:加号改乘号题目大意把1+2+3+48+49中的两个加号改成乘号(修改位置不能相邻),使得式子的结果由1225变为2015。解题分析:用双循环暴力两个乘号的位置,计算在数字i、j后的加号改为乘号,式子数值的变化即可,注意j
11、的起始位置为i+2。代码:#include #include using namespace std;int main() for(int i = 1; i = 48; i+) for(int j = i + 2; j = 48; j+) if(1225 - i - (i + 1) - j - (j + 1) = 2015 - i * (i + 1) - j * (j + 1) coutiendl; return 0;第7题:牌型种数题目大意原题:小明被劫持到X赌城,被迫与其他3人玩牌。一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。这时,小明脑子里突然冒出一个问题:如果不
12、考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?请填写该整数,不要填写任何多余的内容或说明文字。解题分析: 这里也是两种方法, 暴力搜索, 动态规划()。 第一种:暴力方法:#include #include using namespace std;int main() int a13; static int count; int ans = 0; for(a0=0; a0=4; a0+) for(a1=0; a1=4; a1+) for(a2=0; a2=4; a2+) for(a3=0; a3=4; a3+) for(a4=0; a4=4;
13、 a4+) for(a5=0; a5=4; a5+) for(a6=0; a6=4; a6+) for(a7=0; a7=4; a7+) for(a8=0; a8=4; a8+) for(a9=0; a9=4; a9+) for(a10=0; a10=4; a10+) for(a11=0; a11=4; a11+) for(a12=0; a12=4; a12+) if(a0+a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12=13) count+; ans = count; coutansendl; return 0;具体参考:解法二:动态规划,DP。假设牌是从1到1
14、3按顺序取的,dpij表示取到第i号的牌,目前总共有j张牌的取法总数,那么有状态转移方程(注意公式没考虑边界处理):如图:代码:#include #include using namespace std;typedef long long LL;LL dp1414; / dpij: 当前到第i张牌,总共有j张牌时的解的个数int main() dp10 = dp11 = dp12 = dp13 = dp14 = 1; for (int i = 2; i = 13; i+) for (int k = 0; k = 0) dpik += dpi-1k-4; if (k - 3 = 0) dpik
15、+= dpi-1k-3; if (k - 2 = 0) dpik += dpi-1k-2; if (k - 1 = 0) dpik += dpi-1k-1; dpik += dpi-1k; cout dp1313 endl; return 0;第8题:计算房子间曼哈顿距离题目大意房子按S形摆放,如1 2 36 5 47 8 现输入每行的宽度w,计算出任意两个房子m、n的曼哈顿距离(横向距离+竖向距离)。解题分析:直接计算两点的距离就可以了。代码:#include #include #include using namespace std;Fun(int w, int n, int& x, int& y) x = (n - 1) / w + 1;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1