一、奇数倍数
题目链接:奇数倍数 - 蓝桥云课 (lanqiao.cn)
题目要求:
请你找到最小的整数 X 同时满足:
1.XX 是 2019 的整倍数;
2.XX 的每一位数字都是奇数。
解题思路:
最简单的暴力,就不过多赘述了,都在代码里。
#include<bits/stdc++.h> using namespace std; bool pd(int x) { while(x) { if(x%10%2==0)//计算每一位 如果是偶数 就返回false { return false; } x/=10; } return true; } int main() { for(int i=2019;;i+=2019)//2019的倍数 所以+2019 { if(pd(i))//如果是纯奇数 { cout<<i;//输出 break; } } return 0; }
二、第几个幸运数字
题目链接:第几个幸运数字 - 蓝桥云课 (lanqiao.cn)
题目要求:
到 X 星球旅行的游客都被发给一个整数,作为游客编号。
X 星的国王有个怪癖,他只喜欢数字 3,53,5 和 77。
国王规定,游客的编号如果只含有因子:3,5,73,5,7,就可以获得一份奖品。
我们来看前 1010 个幸运数字是:
3 5 7 9 15 21 25 27 35 453579152125273545
因而第 1111 个幸运数字是:4949
小明领到了一个幸运数字 5908470958750559084709587505,他去领奖的时候,人家要求他准确地说出这是第几个幸运数字,否则领不到奖品。
请你帮小明计算一下,5908470958750559084709587505 是第几个幸运数字。
解题思路:
也是一个暴力的题,不难,看代码。
#include<bits/stdc++.h> using namespace std; int main() { long long num = 1; int sum = 0;//幸运数因子只含有3,5,7,所以幸运数必定满足3的i次方乘以5的j次方乘以7的z次方。 for(int i=0;pow(3,i)<59084709587505;i++) { for(int j=0;pow(5,j)<59084709587505;j++) { for(int z=0;pow(7,z)<59084709587505;z++) { num = pow(3,i)*pow(5,j)*pow(7,z); if(num<=59084709587505&&num>1) { sum++; } } } } cout<<sum; return 0; }
三、四平方和
题目链接:“蓝桥杯”练习系统 (lanqiao.cn)
题目要求:
四平方和定理,又称为拉格朗日定理:
每个正整数都可以表示为至多4个正整数的平方和。
如果把0包括进去,就正好可以表示为4个数的平方和。
比如:
5 = 0^2 + 0^2 + 1^2 + 2^2
7 = 1^2 + 1^2 + 1^2 + 2^2
(^符号表示乘方的意思)
对于一个给定的正整数,可能存在多种平方和的表示法。
要求你对4个数排序:
0 <= a <= b <= c <= d
并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法
程序输入为一个正整数N (N<5000000)
要求输出4个非负整数,按从小到大排序,中间用空格分开
解题思路:
暴力+稍微优化就可以AC了,如果用4层for循环直接暴力的话肯定G了,那么优化一下。最后一层for循环是没必要的,因为它可以通过前三次循环来计算出来的,再进行判断是否符合就可以了,并且用x*x<=n/k来控制循环的终止条件可以减少循环次数。因为a是四个数里最小的,它的最小值是0,最大值是500万除以4;b最小值也是0,因为b是bcd三个数中最小的,所以b的最大值是500万除以3 然后就可以推出c和d的最大值。
#include<bits/stdc++.h> using namespace std; int main() { int n; cin>>n; for(int i=0;i*i<=n/4;i++) { for(int j=i;j*j<=n/3;j++) { for(int z=j;z*z<=n/2;z++) { double num = sqrt(n-i*i-j*j-z*z); int sum = sqrt(n-i*i-j*j-z*z); if(num==sum) { cout<<i<<" "<<j<<" "<<z<<" "<<sum; return 0; } } } } }
四、迷宫
题目链接:迷宫 - 蓝桥云课 (lanqiao.cn)
题目要求:
下图给出了一个迷宫的平面图,其中标记为 1 的为障碍,标记为 0 的为可以通行的地方。
010000 000100 001001 110000
迷宫的入口为左上角,出口为右下角,在迷宫中,只能从一个位置走到这个它的上、下、左、右四个方向之一。
对于上面的迷宫,从入口开始,可以按 DRRURRDDDR 的顺序通过迷宫, 一共 1010步。其中 D、U、L、R 分别表示向下、向上、向左、向右走。 对于下面这个更复杂的迷宫(30行 50列),请找出一种通过迷宫的方式,其使用的步数最少,在步数最少的前提下,请找出字典序最小的一个作为答案。
请注意在字典序中 D
01010101001011001001010110010110100100001000101010 00001000100000101010010000100000001001100110100101 01111011010010001000001101001011100011000000010000 01000000001010100011010000101000001010101011001011 00011111000000101000010010100010100000101100000000 11001000110101000010101100011010011010101011110111 00011011010101001001001010000001000101001110000000 10100000101000100110101010111110011000010000111010 00111000001010100001100010000001000101001100001001 11000110100001110010001001010101010101010001101000 00010000100100000101001010101110100010101010000101 11100100101001001000010000010101010100100100010100 00000010000000101011001111010001100000101010100011 10101010011100001000011000010110011110110100001000 10101010100001101010100101000010100000111011101001 10000000101100010000101100101101001011100000000100 10101001000000010100100001000100000100011110101001 00101001010101101001010100011010101101110000110101 11001010000100001100000010100101000001000111000010 00001000110000110101101000000100101001001000011101 10100101000101000000001110110010110101101010100001 00101000010000110101010000100010001001000100010101 10100001000110010001000010101001010101011111010010 00000100101000000110010100101001000001000000000010 11010000001001110111001001000011101001011011101000 00000110100010001000100000001000011101000000110011 10101000101000100010001111100010101001010000001000 10000010100101001010110000000100101010001011101000 00111100001000010000000110111000000001000000001011 10000001100111010111010001000110111010101101111000
解题思路:
正解是BFS,可以用excel做,我把俩方法都写出来。
BFS:
这道题在每个点上记录它的前驱结点就够了,这样从终点能一步步回溯到起点,得到一条完整路径。注意看 print_path(),它是递归函数,先递归再打印。从终点开始,回溯到起点后,再按从起点到终点的顺序,正序打印出完整路径。
#include<bits/stdc++.h> using namespace std; struct node{ int x; int y; }; char mp[31][51]; //存地图 char k[4]={'D','L','R','U'}; int dir[4][2]={{1,0},{0,-1},{0,1},{-1,0}}; int vis[30][50]; //1:已经搜过,不用再搜 char pre[31][51]; //用于查找前驱点。例如pre[x][y] = ‘D’,表示上一个点往下走一步到了(x,y),那么上一个点是(x-1,y) void print_path(int x,int y) { //打印路径:从(0,0)到(29,49) if(x==0 && y==0) //回溯到了起点,递归结束,返回 return; if(pre[x][y]=='D') print_path(x-1,y); //回溯,往上 U if(pre[x][y]=='L') print_path(x, y+1); //回溯,往右 R if(pre[x][y]=='R') print_path(x, y-1); if(pre[x][y]=='U') print_path(x+1,y); printf("%c",pre[x][y]); //最后打印的是终点 } void bfs() { node start; start.x=0; start.y=0; vis[0][0]=1; //标记起点被搜过 queueq; q.push(start); //把第一个点放进队列,开始BFS while(!q.empty()){ node now=q.front(); q.pop(); if(now.x==29 && now.y==49){ print_path(29,49); //打印完整路径,从终点回溯到起点,打印出来是从起点到终点的正序 return; } for(int i=0;i<4;i++){ node next; next.x = now.x+dir[i][0]; next.y = now.y+dir[i][1]; if(next.x<0||next.x>=30||next.y<0||next.y>=50) continue; if(vis[next.x][next.y]==1 || mp[next.x][next.y]=='1') continue; vis[next.x][next.y]=1; pre[next.x][next.y] = k[i]; //记录点(x,y)的前驱 q.push(next); } } } int main(){ for(int i=0;i<30;i++) cin >> mp[i]; bfs(); }
excel大法:
感谢yzm10和知乎某匿名用户的经验,搞了一个比较完善的excel。
效果图
Excel在蓝桥中的普及已经不是第一次了,这里要求会使用替换功能即可。
好了话不多说,第一步需要将01迷宫复制粘贴进txt里,然后将“0”“1”分别替换为“(Tab)0”“(Tab)1”。
(Tab)注:在txt里敲入Tab,即可显示一段空白,复制下来就好。
替换完后是这个样子的:
然后将txt中的内容粘到Excel中,就成了下图:
将表格中1的底色替换为其他颜色,同理也可以将0替换成空格,目的都是为了便于识别。
好了,现在障碍设成了深蓝色,我们也可以将列宽适当得调小些,使单元格看起来更像正方形。
最后一步,把表格截图后用画图打开,就可以用笔来模拟走迷宫了~(如效果图所示)
实践证明,熟练掌握这种做法在考试时并不会占用太多时间
(就是容易出错,yzm10考试时就把路径输反了。。所以一定要细心检查)