2018年蓝桥杯B组真题

2018年蓝桥杯B组真题


A

ans=31+29+31+30+4=125;

B

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int t=10;
	while(t--)
	{
		int a=16;
		while(a--)
		{
			int n,m;
			scanf("%d%d",&n,&m);
			char s[20];
			for(int i=7;i>=0;i--)
			{
				int b=n&1;
				n=n>>1;
				if(b==1) s[i]='*';
				else s[i]=' ';
			}
			for(int i=15;i>7;i--)
			{
				int b=m&1;
				m=m>>1;
				if(b==1) s[i]='*';
				else s[i]=' ';
			}
			for(int i=0;i<16;i++)
			cout<<s[i];
			cout<<endl;
		}
	}
} 

答案为:387420489
C

#include<iostream>
#include<algorithm> 
using namespace std;
int main()
{
	int a=0,b=0;
	for(int i=1;i<=100;i++)
	{
		int n;
		cin>>n;
		while(n%2==0)//最后一位为2的倍数; 
		{
		a++;
		n=n/2;}
		while(n%5==0)//最后一位为5的倍数; 
		{
		b++;
		n=n/5;
		}
		
	}
	a=min(a,b);
	cout<<a<<endl;
 } 
 
//25 2 2||25 4;是一样的效果 
//相当于把每个数数拆成    5*5*5*x   2*2*2*2*5*y  2*5*5*z
//	相乘时2和5得到一个0,也就是   x*y*10*10*10*10 ;

D
https://blog.youkuaiyun.com/weixin_43846139/article/details/88699311?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161571770816780264020244%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=161571770816780264020244&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_click~default-1-88699311.first_rank_v2_pc_rank_v29&utm_term=%E6%B5%8B%E8%AF%95%E6%AC%A1%E6%95%B0
E

#include <stdio.h>
#include<stdlib.h>
int quick_select(int a[], int l, int r, int k) {
	int p = rand() % (r - l + 1) + l;//随机生成l~r的整数; 
	int x = a[p];
	{int t = a[p]; a[p] = a[r]; a[r] = t;}//和右端点交换值 
	int i = l, j = r;
	while(i < j) {
		while(i < j && a[i] < x) i++;
		if(i < j) {
			a[j] = a[i];
			j--;
		}
		while(i < j && a[j] > x) j--;
		if(i < j) {
			a[i] = a[j];
			i++;
		}
	}
	a[i] = x;
	p = i;
	if(i - l + 1 == k) return a[i];
	if(i - l + 1 < k) return quick_select(a,i+1,r,k-(i-l+1)); //填空
	else return quick_select(a, l, i - 1, k);
}
	
int main()
{
	int a[] = {1, 4, 2, 8, 5, 7, 23, 58, 16, 27, 55, 13, 26, 24, 12};
	printf("%d\n", quick_select(a, 0, 14, 5));
	return 0;
}

F

#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int x[N],y[N],z[N];
int n;
int main()
{
	cin>>n;
	for(int i=0;i<n;i++)
	scanf("%d",&x[i]);
	for(int i=0;i<n;i++)
	scanf("%d",&y[i]);
	for(int i=0;i<n;i++)
	scanf("%d",&z[i]);
	sort(x,x+n); 
	sort(y,y+n); 
	sort(z,z+n); 
	int res=0;
	for(int i=0;i<n;i++)
	{
		int sm=lower_bound(x,x+n,y[i])-x;//得到x数组中比y[i]大于或等于的第一个数的位置,因为我们想要得到比y[i]小的数的数量,所以要减一,但下标从零开始,相当于已经减一 
		int bi=upper_bound(z,z+n,y[i])-z;//得到z数值中比y[i]大的第一个数的位置 
		res+=sm*(n-bi) ;				//因为要得到比y[i]大的数的数量,所以:n-(bi+1)-1	化简得(n-bi) 
	}
	cout<<res<<endl;
}
//ctrl+e;复制此行
//ctrl+d;删除此行 

G

#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
int main()
{
	ll x,y,ans=0;
	cin>>x>>y;
	ll a=abs(x),b=abs(y);
	if(a>b)
	{
		if(x>=0)
		{
			ans=4*x*x+x-y;
		}
		else 
		{
			ans=4*x*x+3*x+y;
		}
	}
	else
	{
		if(y>=0)
		{
			ans=4*y*y+x-y;
		}
		else 
		{
			ans=4*y*y-3*y-x; 
		}
	}
	cout<<ans<<endl;
}

H

#include<iostream>
#include<set>
#include<algorithm>
#include<queue>
using namespace std;
struct pe{
	vector<int> ts;
}; 
const int N=1e5+6;
pe q[N];//存每个id的点赞时间; 
int main()
{
	set<int> id;
	int n,d,k;
	cin>>n>>d>>k;
	for(int i=0;i<n;i++)
	{
		int a,b;
		cin>>a>>b;
		id.insert(b);
		q[b].ts.push_back(a);
	}
	for(auto it=id.begin();it!=id.end();it++)
	{
		int a=*it;
		if(q[a].ts.size()<k)//如果人数少于k; 
		{
			continue;
		}
		sort(q[a].ts.begin(),q[a].ts.end());//将id为a的点赞时间排序 
		for(int i=0;i<n;i++)
		{
			if(q[a].ts[k+i-1]-q[a].ts[i]<d&&i+k-1<q[a].ts.size())//从第i个点赞时间到第i+k-1个点赞时间间隔要小于d
			{													 
				cout<<a<<endl;
				break;
			}
		}
	}
	return 0; 
}

I

#include<iostream>
#include<queue>
#include<string>
using namespace std;
typedef pair<int,int> PII;
const int N=1010;
int a[N][N],ma[N][N];//a数组标记是否被查询过,ma数值标记是否被淹没; 
int n;
int res=0,ans=0;//res记录有多少岛屿 ,ans记录未被淹没的岛屿的数量; 
char m[N][N];//m数组存地图; 
int dx[5]={1,-1,0,0},dy[5]={0,0,-1,1};//上 下 左 右 ; 
void bfs(int b,int c)
{
	if(a[b][c]==1)
	return;
	int flag=1;
	queue<PII> q;
	q.push(make_pair(b,c));
	while(q.size())
	{
		PII t=q.front();
		q.pop();
		for(int i=0;i<4;i++)
		{
			int x=t.first+dx[i],y=t.second+dy[i];
			if(x>=0&&y>=0&&x<n&&y<n&&m[x][y]=='.')
			{
				ma[t.first][t.second]=1;
			}
			if(x>=0&&y>=0&&x<n&&y<n&&a[x][y]==0&&m[x][y]=='#')
			{
				q.push(make_pair(x,y));
				a[x][y]=1;
			} 
		}
		if(ma[t.first][t.second]==0&&flag==1)
		{
			flag=0;
			ans++;
		}
	}
	res++;
}
int main()
{
	
	cin>>n;
	for(int i=0;i<n;i++)
	{	
		cin>>m[i];
	}
	for(int i=0;i<n;i++)
	for(int j=0;j<n;j++)
	{
		if(m[i][j]=='#')
		bfs(i,j);
	}
	cout<<res-ans<<endl;//岛屿的总数减被淹没的得未被淹没的岛屿的数量; 
} 

J

//该题的题解是整理了一下 y总视频里面讲解思路,希望对看完视频还不大理解的同学有点帮助
//首先我们知道 如果 k == n ,那么就证明所有的数字是全部都选,
//             如果 k < n , 那么就要思考怎样去选择了:
//1.k 如果是偶数的话,选出来的结果一定是非负数 , 原因如下:
//             (1) # 负数的个数是偶数个的话,负负得正,那么一定是非负数
//             (2) # 负数的个数如果是奇数个的话,那么我们就只选偶数个绝对值最大的负数
//2.k 如果是奇数个的话,
//             (1)# 所有的数字如果都是负数,那么选出来的结果也一定都是负数    
//             (2)# 否则的话,则一定至少有 1个非负数, 那么我们将最大的数取出来, 此时要选的个数就是 k--, 
//                # k-- 是偶数,那么就又转化为 k-- 是偶数的情况思考
//
//作者:大厂狗狗
//链接:https://www.acwing.com/solution/content/8724/
//来源:AcWing
#include<iostream>
#include<algorithm>
#define int long long
using namespace std;
const int N=1e5+10,p=1000000009; 
int a[N];
main()
{
	int n,k;
	scanf("%lld%lld",&n,&k);
	for(int i=0;i<n;i++)
	{
		scanf("%lld",&a[i]);
	}
	sort(a,a+n);
	int res=1;//乘积初始化 
	int sign=1;//符号初始化 
	int l=0,r=n-1;//双指针初始化 
	if(k%2==1)//k为奇数 
	{
		res*=a[r];
		r--;
		k--;
		if(res<0)
		sign=-1;  //如果k为奇数,并且最大数为负数,那么乘积一定为负数;    
	}
	while(k)//k此时必为偶数 
	{
		int x=(int)a[l+1]*a[l],y=(int)a[r]*a[r-1];
		if(x*sign>y*sign)//选择更大的一对
		{
			res=res*(x%p)%p;
			l+=2;//指针移动 
		}
		else
		{
			res=res*(y%p)%p;
			r-=2;
		}
		k-=2;
	}
	cout<<res<<endl;
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

炎丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值