计蒜客2020 蓝桥杯省赛 B 组模拟赛(一)

1、有趣的数字

 题目描述:我们称一个数是质数,而且数位中出现了 55 的数字是有趣的。例如 5, 59, 4575,59,457 都是有趣的,而 15, 715,7 不是。求 11 到 100000100000 中有趣的数的个数。

思路:这道题就是判断质数,和分解数字,通过for循环对1~100000的每一个数进行判断。

考点:判断质数、分解数字

#include<bits/stdc++.h>
using namespace std;

int ip(int x)
{
	for(int i=2;i*i<=x;i++)
	{
		if(x%i==0)
			return 0;
	}
	return 1;
}
int hf(int x)
{
	while(x)
	{
		if(x%10==5)
			return 1;
		x/=10;
	}
	return 0;
}
int main()
{
	int cnt=0;
	for(int i=1;i<=100000;i++)
	{
		if(ip(i)&&hf(i))
			cnt++;
	}
	cout<<cnt;
	return 0;
 } 

2、爬楼梯

题目描述:蒜头君要爬楼梯。楼梯一共有 1010 层台阶。因为腿长的限制,每次最多能上 44 层台阶。但是第 5,75,7 层楼梯坏掉了不能踩。求上楼梯的方案数。 

思路:达到第某一层可以通过上1层、2层、3层,4层实现。那么从第十层开始逐层往下考虑。

考点:递归

#include<bits/stdc++.h>
using namespace std;

int up(int x)
{
	if(x==0)
		return 1;
	else if(x==5||x==7||x<0)
		return 0;
	else if(x>1)
		return up(x-1)+up(x-2)+up(x-3)+up(x-4);
	
}
int main()
{
	int n;
	cin>>n;
	cout<<up(n);
	return 0;
}

4、苹果

题目描述:

有 30 个篮子,每个篮子里有若干个苹果,篮子里的苹果数序列已经给出。

现在要把苹果分给小朋友们,每个小朋友要么从一个篮子里拿三个苹果,要么从相邻的三个篮子里各拿一个苹果。

苹果可以剩余,而且不同的拿法会导致不同的答案。比如对于序列3 1 3 ,可以分给两个小朋友变成0 1 0;也可以分给一个小朋友变成2 0 2,此时不能继续再分了。所以答案是 22 。

求问对于以下序列,最多分给几个小朋友?

7 2 12 5 9 9 8 10 7 10 5 4 5 8 4 4 10 11 3 8 7 8 3 2 1 6 3 9 7 1

思路: 先把判断每个篮子的苹果是否多于个,如果是的话先分给一个小朋友。这样分一轮,最后篮子里剩的都少于3,然后在进行三个相邻的拿。

考点:贪心 

#include<bits/stdc++.h>
using namespace std;

int a[35]={0};
int main()
{
	int ans=0;
	
	for(int i=0;i<30;i++)
		cin>>a[i];

	for(int i=0;i<30;i++)
	{
		if(a[i]>=3)
		{
			ans+=a[i]/3;
			a[i]=a[i]%3;
		}
		while(a[i]>=1&&a[i+1]>=1&&a[i+2]>=1)
	 	{
	 			ans++;
	 			a[i]--,a[i+1]--,a[i+2]--;
		 }
			
	 } 
	 cout<<ans;
	 return 0;
	
}

6、寻找重复项

题目描述:

输入格式

第一行三个整数 A,B,CA,B,C 。

输出格式

输出一行一个整数表示答案。

样例输入

2 2 9

样例输出

4

思路:这道题的思路就是,把每个数组的值计算出来,存到map里,每次计算出后先查找是否已经map里存有。若有,返回数组下标,没有用map标记一下然后继续计算下一个。不过由于时间限制,这里要用unordere_map,顾名思义,用法和map一样,就是这个是无序的,map会自动排序,这道题不需要排序,只需要速度够快就可。 

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e6+5;
typedef long long ll;
unordered_map <long long,int> mp;
int main()
{
	ll t[maxn];
	t[0]=1;
	mp[t[0]]=1;
	ll a,b,c;
	for(int i=1;i<=2000000;i++)
	{
		cin>>a>>b>>c;
		t[i]=(a*t[i-1]+t[i-1]%b)%c;
		if(mp[t[i]])
			{
				cout<<i;
				return 0;
			}
		
		mp[t[i]]=1;	
	}
	cout<<-1;
	return 0;	
}

猜你喜欢

转载自blog.csdn.net/Lyyforever1220/article/details/109001684