[蓝桥杯2019初赛]数列求值
Tag
数学
题意
数列 a
,a[0] = a[1] = a[2] = 1
,从第四项开始等于前三项之和,求 a[20190323]
后 4
位
#include<iostream>
using namespace std;
const int N=20190324;
int a[N];
int main(){
a[0]=a[1]=a[2]=1;
for(int i=3;i<=20190324;i++)
a[i]=(a[i-1]+a[i-2]+a[i-3])%10000;
cout<<a[20190323]<<endl;
return 0;
}
[蓝桥杯2019初赛]迷宫
Tag
bfs
题意
二维迷宫,1
代表有障碍
注意这题没有输入,所以可以直接输出数据
print("DDDDRRURRRRRRDRRRRDDDLDDRDDDDDDDDDDDDRDDRRRURRUURRDDDDRDRRRRRRDRRURRDDDRRRRUURUUUUUUULULLUUUURRRRUULLLUUUULLUUULUURRURRURURRRDDRRRRRDDRRDDLLLDDRRDDRDDLDDDLLDDLLLDLDDDLDDRRRRRRRRRDDDDDDRR")
以下是含有输入的 code
#include<iostream>
#include<cstring>
#include<queue>
#define aa first
#define bb second
using namespace std;
const int dx[4]={1,0,0,-1};
const int dy[4]={0,-1,1,0};
const char ch[4]={'D','L','R','U'};
int g[30][50];
int d[30][50];
int min=1500;
string s;int l;
bool check(int x,int y){
return x>=0&&y>=0&&x<30&&y<50;
}
string bfs(){
memset(d,-1,sizeof d);
queue<pair<pair<int,int>,pair<string,int>>> q;
q.push({{0,0},{"",0}});
d[0][0]=0;
while(q.size()){
auto t=q.front();
q.pop();
for(int i=0;i<4;i++){
int a=t.aa.aa,b=t.aa.bb;
string str=t.bb.aa;
int len=t.bb.bb;
int x=a+dx[i],y=b+dy[i];
if(check(x,y)&&!g[x][y]&&d[x][y]==-1){
d[x][y]=d[a][b]+1;
string tempstr=str+ch[i];
if(x==29&&y==49)return tempstr;
q.push({{x,y},{tempstr,len+1}});
}
}
}
return s;
}
int main(){
for(int i=0;i<30;i++)
for(int j=0;j<50;j++)
scanf("%1d",&g[i][j]);
cout<<bfs()<<endl;
return 0;
}
[蓝桥杯2019初赛]完全二叉树的权值
Tag
二叉树
题意
完全二叉树中第一个数的深度为 1
,求同深度的权值和最大值,输出深度
完全二叉树
一棵深度为
k
的有n
个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i
(1≤i≤n)
的结点与满二叉树中编号为i
的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。
#include<iostream>
using namespace std;
typedef long long ll;
int main(){
int n;cin>>n;
int level=1,count=0,num=1;
ll a[20]={0};
for(int i=0;i<n;i++){
int x;cin>>x;
a[level]+=x;
count++;
if(count==num){
count=0;
num<<=1;
if(i<n)level++;
}
}
ll maxx=-1e10,ans=1;
for(int i=1;i<=level;i++){
if(a[i]>maxx){
maxx=a[i];
ans=i;
}
}
cout<<ans<<endl;
return 0;
}
[蓝桥杯2019初赛]组队
Tag
瞪着眼睛看
题意
每列找一个,编号不一样,总和最大的
#include<iostream>
using namespace std;
int main(){
cout<<98+99+98+97+98<<endl;
return 0;
}
[ 蓝桥杯2019初赛]年号字串
Tag
进制
题意
A = 1
,AB = 27
,AB = 28
,求 2019
对应的字符串
#include<iostream>
using namespace std;
int a[5],idx;
int main(){
int x=2019;
while(x){
a[++idx]=x%26;
x/=26;
}
for(int i=idx;i;i--)
cout<<char('A'+a[i]-1);
return 0;
}
[ 蓝桥杯2019初赛]数的分解
Tag
枚举
题意
将一个数分成三个不同的数,一共能分成多少组?
#include<iostream>
using namespace std;
int cnt;
bool check(int x){
while(x){
if(x%10==2||x%10==4)return 0;
x/=10;
}
return 1;
}
int main(){
for(int i=1;i<673;i++){
for(int j=i+1;i+j<2019;j++){
int k=2019-i-j;
if(k<=j)continue;
if(check(i)&&check(j)&&check(k))
cnt++;
}
}
cout<<cnt<<endl;
return 0;
}
[蓝桥杯2019初赛]特别数的和
Tag
枚举
题意
求 1~n
中含有 2, 0, 1, 9
的数的和
#include<iostream>
using namespace std;
int cnt;
bool check(int x){
while(x){
int t=x%10;
if(t<=2||t==9)return 1;
x/=10;
}
return 0;
}
int main(){
int n;cin>>n;
for(int i=1;i<=n;i++)
if(check(i))
cnt+=i;
cout<<cnt<<endl;
return 0;
}
[蓝桥杯2019初赛]等差数列
Tag
gcd
题意
给定 n
个整数 a[i]
,求包含它们的最小等差数列项数
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+2;
int a[N];
int gcd(int a,int b){
return b?gcd(b,a%b):a;
}
int main(){
int n;cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
sort(a,a+n);
int res=a[1]-a[0];
for(int i=2;i<n;i++){
res=gcd(res,a[i]-a[i-1]);
}
if(a[n-1]==a[0])cout<<n<<endl;
else cout<<(a[n-1]-a[0])/res+1<<endl;
return 0;
}
[蓝桥杯2019初赛]后缀表达式
Tag
stack
题意
含 n
个加号,m
个减号,给定 n+m+1
个数字,求值最大的后缀表达式
后缀表达式
可参考 https://blog.csdn.net/a8425/article/details/119253258
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=2e5+2;
ll a[N],b[N];
int na,nb,nc;
bool cmp(int a,int b){return a>b;}
int main(){
int n,m;cin>>n>>m;
int num=n+m+1;
ll res=0;
for(int i=0;i<num;i++){
int x;cin>>x;
res+=x;
if(x<0)a[na++]=x;
else if(x>0)b[nb++]=x;
else nc++;
}
sort(a,a+na,cmp);
sort(b,b+nb);
if(m){
if(na){
if(na==num){
for(int i=1;i<na;i++)
res-=2*a[i];
}else{
for(int i=0;i<na;i++)
res-=2*a[i];
}
}else{
if(!nc)res-=2*b[0];
}
}
cout<<res<<endl;
return 0;
}
[ 蓝桥杯2019初赛]灵能传输
Tag
前缀和
题意
每次选择一个 i
使得 a[i+1]+=a[i]
、a[i-1]+=a[i]
、a[i]-=2*a[i]
,求使得最大的 a[i]
的最小值