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;
}