大家好,我是泡泡,今天的题目很合理,很多模板,大家多多掌握,学习一下用各种思路解题,灵活多变!
目录
一丶金币(模拟)
题目要求:
国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币......;这种工资发放模式会一直这样延续下去:当连续 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)
题目要求:
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()
{
queue<node>q;//队列
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;
}
四丶 蓝肽子序列(动态规划)
题目要求:
解题思路:
最长公共子序列 直接dp。
这个题不太会,等学了补上。