2018年蓝桥杯省赛 C++ B组

  • Post author:
  • Post category:其他




题目链接:

[蓝桥杯2018初赛]乘积尾零

在这里插入图片描述

答案:31

题解:通过思考10的产生是由2和5共同作用的,要知道有几个0,每出现一个10,就应从乘数中可以提出一个2、一个5。所以我们把每个数的都分解成乘积的形式 ,统计出 2和 5的数量,取他们的最小值。

#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int sum2=0,sum5=0;//sum2记录2的个数,sum5记录5的个数 
	for(int i=0;i<100;i++)
	{
		int x;
		cin>>x;
		int s=x;
		while(s&&s%2==0)
		{
			s/=2;
			sum2++;
		}
		while(s&&s%5==0)
		{
			s/=5;
			sum5++;
		}
	}
	cout<<min(sum2,sum5)<<endl;
}
//100
//100/2 50
//50/2  25
//25/5  5
//5/5   1 
//5的个数为2,2的个数为2 



题目链接:

[蓝桥杯2018初赛]全球变暖

在这里插入图片描述

考点:搜索

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=1e7+5;
char a[1005][1005];
int book[1005][1005];
int nx[4][2]={{0,1},{0,-1},{1,0},{-1,0}},f;
void dfs(int x,int y)
{
	book[x][y]=1;//标记该点已经走过 
	if(a[x][y-1]=='#'&&a[x][y+1]=='#'&&a[x+1][y]=='#'&&a[x-1][y]=='#')
	//说明该岛屿不会被淹没 
	f=1;
	for(int i=0;i<4;i++)
	{
		int tx=x+nx[i][0];
		int ty=y+nx[i][1];
		if(book[tx][ty]==0&&a[tx][ty]=='#')
		//如果该点没有走过且该点是岛屿便继续往下进行搜索 
		dfs(tx,ty);
	}
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int n;
	cin>>n;
	int sum=0;
	for(int i=0;i<n;i++)
	cin>>a[i];
	for(int i=0;i<n;i++)
	for(int j=0;j<n;j++)
	{
		if(a[i][j]=='#'&&book[i][j]==0)//如果该点是岛屿且没有走过 
		{
			f=0;
			dfs(i,j);
			if(!f)//如果不被淹没,sum++; 
			sum++;
		}
	}
	cout<<sum<<endl;
}




题目链接:

[蓝桥杯2018初赛]明码

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=1e7+5;
string a,b;
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	bitset<8>t;//包括负数转二进制数,t可以当成函数用
	for(int i=0;i<10;i++)
	{
		for(int j=0;j<16;j++)
		{
			int x,y;
			cin>>x>>y;
			t=x;
			a=t.to_string();
			//包括负数转二进制数,t可以当成函数用
			t=y;
			b=t.to_string();
			a+=b;
			//字符串拼接
			for(int k=0;k<a.length();k++)
			{
				if(a[k]=='1')
				cout<<"*";
				else
				cout<<" ";
			}
			cout<<endl;
		 } 
	}
		long long sum=pow(9,9);
		cout<<sum<<endl;
}




题目链接:

[蓝桥杯2018初赛]第几天

在这里插入图片描述

在这里插入图片描述

答案:125,差值+1



题目链接:

[蓝桥杯2018初赛]测试次数

在这里插入图片描述

参考博客:

博客详细讲解


答案:19

#include<bits/stdc++.h>
using namespace std;
#define int long long
int dp[1005][10];
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	for(int i=1;i<1001;i++)
	dp[i][1]=i;//初始化 
	for(int j=2;j<=3;j++)
	for(int i=1;i<=1000;i++)
	{
		dp[i][j]=2e9;
		for(int k=2;k<=i;k++)
		dp[i][j]=min(dp[i][j],1+ max(dp[k-1][j-1],dp[i-k][j]));
	}
	cout<<dp[1000][3]<<endl;
	//cout<<19<<endl;
}



题目链接:

[蓝桥杯2018初赛]递增三元组

在这里插入图片描述

在这里插入图片描述

题解:遍历b数组,用b数组确定a满足条件的有多少个,c数组确定满足条件的有多少个,然后相乘。再相加。

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=1e6+5;
int a[maxn],b[maxn],c[maxn]; 
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	cin>>a[i];
	for(int i=0;i<n;i++)
	cin>>b[i];
	for(int i=0;i<n;i++)
	cin>>c[i];
	sort(a,a+n);
	sort(b,b+n);
	sort(c,c+n);
	int p=0,q=0,sum=0;
	for(int i=0;i<n;i++)
	{
		while(p<n&&a[p]<b[i])
		p++;
		while(q<n&&c[q]<=b[i])
		q++;
		sum+=p*(n-q);
	}
	cout<<sum<<endl;
}



题目链接:

[蓝桥杯2018初赛]螺旋折线

在这里插入图片描述

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=1e6+5;
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int x,y,sum=0;
	cin>>x>>y;
	if(abs(x)<=y&&y>=0)//左上方 
	{
		cout<<2*y*(2*y-1)+(x-(-y))<<endl;
	}
	else if(abs(y)<=x)//左下方
	{
		cout<<2*x*2*x+x-y<<endl;
	 } 
	 else if(abs(x)<=abs(y)+1&&y<0)//下方 
	 {
	 	int n=abs(y);
	 	cout<<2*n*(2*n+1)+n-x<<endl;
	 }
	 else//左方 
	 {
	 	int n=abs(x);
	 	cout<<(2*n-1)*(2*n-1)+y-(-n+1)<<endl;
	 }
}




题目链接:

[蓝桥杯2018初赛]日志统计

在这里插入图片描述



方法一:暴力加剪枝

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=1e6+5;
int book[maxn];
struct s
{
	int ts,id;
}s1[maxn];
bool cmp(s x, s y)
{
	if(x.id==y.id)
	return x.ts<y.ts;
	return x.id<y.id;
 } 
 //如果id相同,按ts从小到大排序
 //否则按id从小到大排序 
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int n,d,k;
	cin>>n>>d>>k; 
	for(int i=0;i<n;i++)
	cin>>s1[i].ts>>s1[i].id;
	sort(s1,s1+n,cmp);
	for(int i=0;i<n;i++)
	{
		int s=1;
		if(book[s1[i].id]==0)
		{
			for(int j=i+1;j<n;j++)
			{
				if(s1[i].id==s1[j].id&&s1[j].ts<(s1[i].ts+d))
				s++;
				if(s==k||s1[i].id!=s1[j].id)//剪枝 
				break;
			}
			if(s==k)
			{
				book[s1[i].id]=1;
				cout<<s1[i].id<<endl;
			}
		}
	} 
}




方法二:尺取法

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=1e6+5;
int book[maxn];
bool vis[maxn];
struct s
{
	int ts,id;
}s1[maxn];
bool cmp(s x, s y)
{
	if(x.id==y.id)
	return x.ts<y.ts;
	return x.id<y.id;
 } 
 //如果id相同,按ts从小到大排序
 //否则按id从小到大排序 
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int n,d,k;
	cin>>n>>d>>k; 
	for(int i=0;i<n;i++)
	cin>>s1[i].ts>>s1[i].id;
	sort(s1,s1+n,cmp);
	for(int i=0,j=0;i<n;i++)
	{
		book[s1[i].id]++;
		while(s1[i].ts-s1[j].ts>=d)
		book[s1[j++].id]--;
// j 往后加一个 那么 j 代表 的日志不在当前区间,次数 - 1
		if(book[s1[i].id]>=k)
		vis[s1[i].id]=true;
	}
	for(int i=0;i<maxn;i++)
	if(vis[i])
	cout<<i<<endl;
}




题目链接:

[蓝桥杯2018初赛]乘积最大

在这里插入图片描述

详细博客讲解:

博客讲解



版权声明:本文为weixin_52513845原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。