题目链接:
[蓝桥杯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 版权协议,转载请附上原文出处链接和本声明。