一、金币(模拟)
题目链接:金币 - 蓝桥云课 (lanqiao.cn)
题目要求:
国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币......;这种工资发放模式会一直这样延续下去:当连续 N 天每天收到 N 枚金币后,骑士会在之后的连续 N+1 天里,每天收到 N+1 枚金币。
请计算在前 K 天里,骑士一共获得了多少金币。
解题思路:
定义一个金币数量 一个总和 每过完一个阶段金币上限+1 如果天数过了就跳出循环。
#include<bits/stdc++.h> using namespace std; int main() { int n; cin>>n; int m = 1; int sum = 0; for(int j=1;j<=n;) { for(int i=1;i<=m;i++) { sum += m; j++; if(j>n) { break; } } m++; } cout<<sum; return 0; }
二、优秀的拆分(位运算)
题目链接:
题目要求:
一般来说,一个正整数可以拆分成若干个正整数的和。
例如,1=1,10=1+2+3+4 等。对于正整数 n 的一种特定拆分,我们称它为“优秀的”,当且仅当在这种拆分下,nn 被分解为了若干个不同的 2 的正整数次幂。注意,一个数 x 能被表示成 2 的正整数次幂,当且仅当 xx 能通过正整数个 2 相乘在一起得到。
例如,10=8+2=2^3+2^1是一个优秀的拆分。但是,7=4+2+1=2^2+2^1+2^0 就不是一个优秀的拆分,因为 1 不是 2 的正整数次幂。
现在,给定正整数 n,你需要判断这个数的所有拆分中,是否存在优秀的拆分。若存在,请你给出具体的拆分方案。
解题思路:
位运算 如果这个数字该位数为1 那么就输出该位
#include<bits/stdc++.h> using namespace std; int main() { int n; cin >> n; if(n%2) { cout<<"-1"; return 0; } for(int i=25;i>=0;i--) { if(n>>i&1) { printf("%d ",1<<i); } } return 0; }
三、穿越雷区(bfs)
题目链接:“蓝桥杯”练习系统 (lanqiao.cn)
题目要求:
X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废。
某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短?
已知的地图是一个方阵,上面用字母标出了A,B区,其它区都标了正号或负号分别表示正负能量辐射区。
例如:
A + - + -
- + - - +
- + + + -
+ - + - +
B + - + -
坦克车只能水平或垂直方向上移动到相邻的区。
解题思路:
一个bfs模板,bfs就行。
#include<bits/stdc++.h> using namespace std; int dx[]={-1,1,0,0}; int dy[]={0,0,-1,1}; char ch[110][110]; int n,bx,by,ex,ey; struct node{ int x,y,step; char cc; }; bool vis[110][110]; bool check(int x,int y,char c)//判断是否越界 { if(!vis[x][y]&&x>0&&y>0&&x<=n&&y<=n&&ch[x][y]!=c)//没有搜过 坐标不越界 { return 1; } return 0; } int bfs() { queueq;//队列 q.push(node{bx,by,0,'r'});//bx by 0 r进队 vis[bx][by]=1;//标记这个地方被搜过了 while(q.size())//队列不空 { node now;//结构体变量 now=q.front();//now等于队列首值 q.pop();//弹出 if(now.x==ex&&now.y==ey)//如果现在的坐标和终点一样 { return now.step;//返回路径 } for(int i=0;i<4;i++)//四个方向 { int x=now.x+dx[i]; int y=now.y+dy[i]; if(check(x,y,now.cc))//不越界 { q.push(node{x,y,now.step+1,ch[x][y]});//压入 vis[x][y]=1; } } } return -1; } int main() { cin>>n; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { cin>>ch[i][j];//读入 if(ch[i][j]=='A')//定位起点 { bx=i; by=j; } if(ch[i][j]=='B')//定位终点 { ex=i; ey=j; } } } cout<<bfs(); return 0; }
四、 蓝肽子序列(动态规划)
题目链接:“蓝桥杯”练习系统 (lanqiao.cn)
题目要求:
解题思路:
最长公共子序列 直接dp。
这个题不太会,等学了补上。