2020 第十一届蓝桥杯校内模拟赛非标程题解

目录

约数:

内存:

1~2019:

2019个结点的树:

递增三元组的中心:

数位递增的数:

单词hello:

正整数序列:

种草

节目:


约数:

1200000有多少个约数(只计算正约数);

暴力枚举即可   一共96个;

内存:

在计算机存储中,15.125GB是多少MB?

1GB=1024MB;

15.125*1024=15488;

1~2019:

在1至2019中,有多少个数的数位中包含数字9?

对于每一个数枚举每一位是否含有9;

#include <bits/stdc++.h>
using namespace std;
bool check(int x)
{
	while(x)
	{
		if(x%10==9) return true;
		x/=10;
	}
	return false;
}
int main()
{
	int cnt=0;
	for(int i=1;i<=2019;i++)
		if(check(i)) cnt++;
	cout <<cnt<<endl;
    return 0;
}

2019个结点的树:

一棵包含有2019个结点的树,最多包含多少个叶结点?

如果是具有N个节点的二叉树,那么规律是:

N为偶数:叶子节点为N/2
N为奇数:叶子节点为N/2+1

但是这里没说是二叉树,那么完全可以是菊花树(凭空想象,凭空捏造,无言无语,无可救药qaq...)

也就是2019-1=2018个;

递增三元组的中心:

对于每个数,找在他左边有没有比他小的,右边有没有比他大的,时间复杂度O(N^2); 1s可以过去

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[1005];
int main()
{
	int n,cnt=0;
	cin >>n;
	for(int i=1;i<=n;i++)
	{
		cin >>a[i];
	}
	for(int i=2;i<n;i++)
	{
		int x=a[i],flag1=0,flag2=0;
		for(int j=1;j<i;j++)
		{
			if(a[j]<x)
			{
				flag1=1;
				break;
			}
		}
		for(int j=i+1;j<=n;j++)
		{
			if(a[j]>x)
			{
				flag2=1;
				break;
			}
		}
		if(flag1&&flag2) cnt++;
	}
	cout <<cnt<<endl;
}

数位递增的数:

把每个数的数位分解出来,每次分解的时候看分解出来的数是否比上次分解出来的数要小或者等于;

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
bool check(int x)
{
	int res=10;
	while(x)
	{
		if(x%10>res) return false;
		res=x%10;
		x/=10;
	}
	return true;
}
int main()
{
	int n,cnt=0;
	cin >>n;
	for(int i=1;i<=n;i++)
	{
		int x=i;
		if(check(x)) cnt++;
	}
	cout <<cnt<<endl;
}

单词hello:

很多种做法,最笨的做法就是找到这三个转折点,然后第一个转折点左边一定是辅音字母,第一个转折点到第二个转折点之间一定是元音字母,以此类推判断即可;

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
map<char,int> mp;
char s[1001];
vector<int> v; 
int main()
{
	mp['a']=mp['e']=mp['i']=mp['o']=mp['u']=1;
	cin >>s;
	int cnt=0,len=strlen(s),flag=1;
	for(int i=1;i<len;i++)
	{
		if(mp[s[i]]!=mp[s[i-1]]) v.push_back(i);
	}
	if(v.size()!=3) flag=0;
	else
	{
		int a=v[0],b=v[1],c=v[2];
		for(int i=0;i<a;i++) if(mp[s[i]]) flag=0;
		for(int i=a;i<b;i++) if(!mp[s[i]]) flag=0;
		for(int i=b;i<c;i++) if(mp[s[i]]) flag=0;
		for(int i=c;i<len;i++) if(!mp[s[i]]) flag=0;
	}
	if(flag) cout <<"yes"<<endl;
	else cout <<"no"<<endl;
}

正整数序列:

按照题意进行dfs,并且加上记忆化搜索;

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=10000;
ll dp[1005][1005];
ll dfs(int x,int y)
{
	//cout <<x<<" "<<y<<endl;
	if(abs(x-y)==1||abs(x-y)==0)
	{
		return 0;
	}
	if(dp[x][y]) return dp[x][y];
	for(int i=1;i<abs(x-y);i++)
	{
		dp[x][y]+=dfs(y,i)%mod+1;
	}
	return dp[x][y]%mod;
}
int main()
{ 
	int n;
	cin >>n;
	ll cnt=0;
	for(int i=1;i<=n;i++)
	{
		cnt+=dfs(n,i)%mod;
	}
	cnt+=n;
	cout <<cnt%mod<<endl;
}

种草

bfs应该是100分做法,我只写了暴力,估计50分;

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1005;
char mp[N][N];
int main()
{ 
	int n,m,k;
	cin >>n>>m;
	for(int i=1;i<=n;i++)
	{
		getchar();
		for(int j=1;j<=m;j++) cin >>mp[i][j];
	}
	cin >>k;
	for(int i=1;i<=k;i++)
	{
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
			{
				if(mp[i][j]=='g')
				{
					if(mp[i-1][j]!='g') mp[i-1][j]='*';
					if(mp[i+1][j]!='g') mp[i+1][j]='*';
					if(mp[i][j-1]!='g') mp[i][j-1]='*';
					if(mp[i][j+1]!='g') mp[i][j+1]='*';
				}
			}
		}
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
			{
				if(mp[i][j]=='*')
				{
					mp[i][j]='g';
				}
			}
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++) cout <<mp[i][j];
		cout <<endl;
	}
}

节目:

感觉应该像用单调栈或者单调队列维护,但是不晓得怎么写,下面是暴力,估计60分;

#include <bits/stdc++.h>
using namespace std;
struct node
{
	int x,id;
}bb[100005];
bool cmp(node a,node b)
{
	return a.x>=b.x;
}
int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin >>bb[i].x,bb[i].id=i;
	sort(bb+1,bb+n+1,cmp);
	int temp=-1;
	for(int i=1;i<=m;i++)
	{
		for(int j=1;j<=n;j++)
		{
		//	cout <<n<<" "<<bb[j].id<<" "<<m<<" "<<i<<" "<<temp<<endl;
			if(n-bb[j].id>=m-i&&bb[j].id>temp)
			{
				cout <<bb[j].x<<" "; 
				temp=bb[j].id;
				break;
			} 
		}
	}
    return 0;
}
发布了216 篇原创文章 · 获赞 49 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/weixin_43872728/article/details/104862543