目录
找规律
P8781 [蓝桥杯 2022 省 B] 修剪灌木
字符串
P8723 [蓝桥杯 2020 省 AB3] 乘法表
队列
P8641 [蓝桥杯 2016 国 C] 赢球票
找规律
P8781 [蓝桥杯 2022 省 B] 修剪灌木
思路:对某个特定的点来说有向前和向后的情况,即有向前再返回到该位置和从该位置向后再返回到该位置的两种情况,枚举这两种情况取最大值
详细思路:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)//枚举每一颗树
{
//对左右边的路径进行比较,由于会往返注意要乘2
cout<<max(i-1,n-i)*2<<endl;
}
return 0;
}
字符串
P8723 [蓝桥杯 2020 省 AB3] 乘法表
进制的转换:短除法(熟知的方法就是整数十进制转换位2进制)
注意!!乘法表输出的每一个数都要是在n进制下的数,不是只有答案是n进制!!
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
string check(int x,int y)//将十进制数转换为n进制
{
int t=x*y;//十进制数
string s;
while(t)//短除法进行进制转换
{
int r=t%n;
if(r>=10)//十六进制以上的情况
s+=r-10+'A';
else
s+=r+'0';
t/=n;
}
//最后需要逆序取结果,但是此时的结果是正序
reverse(s.begin(),s.end());
return s;
}
int main()
{
cin>>n;
for(int i=1;i<n;i++)
{
for(int j=1;j<=i;j++)
{
cout<<check(i,1)<<'*'<<check(j,1)<<'='<<check(i,j)<<' ';
}
cout<<endl;
}
return 0;
}
队列
P8641 [蓝桥杯 2016 国 C] 赢球票
思路:纸牌的顺序给定,能从所有的位置开始,求能拿的最大数字和
这道题要使用队列,具有先进先出的性质,即
题目中的纸牌是一个圆圈,遍历时要进行循环遍历,且具有先进先出的形式,即可判断需要使用队列
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int N=100+10;
int n;
int a[N];
int check(int x)//开始拿取的位置
{
queue<int> q;//建立一个队列,存放循环数据
//因为纸牌围成一个圈,根据题目规则,当拿取位置是x时
//一定是先遍历x之后的数,再遍历x之前的数
for(int i=x;i<=n;i++)//将x位置之后的数据入队,使其存放在队前
q.push(a[i]);
for(int i=1;i<x;i++)//将x之前的数入队 ,使其存放在队后
q.push(a[i]);
int sum=0;//卡牌数之和
int tmp=1;//记录从1开始的数的数
while(q.size())
{
int t=q.front();q.pop();//先将队头数据取出进行判断
if(t==tmp)//数到的数与卡牌数相同
{
sum+=t;
tmp=1;//拿取后需从头开始
}
else//数的数与卡牌数不同
{
q.push(t);//不同,将该数如队尾,遍历下一个数
tmp++;//数下一个数
}
if(tmp>n)//已经数完了,即这种拿法结束
break ;
}
return sum;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
int ans=0;
for(int i=1;i<=n;i++)//对每个位置进行遍历
ans=max(check(i),ans);
cout<<ans<<endl;
return 0;
}