大家好,我是泡泡,今天给大家带来今日打卡三道题的题解
目录
一、纯质数
题目要求:
如果一个正整数只有 11 和它本身两个约数,则称为一个质数(又称素数)。
前几个质数是:2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, · · ·
如果一个质数的所有十进制数位都是质数,我们称它为纯质数。例如:2,3, 5, 7, 23, 37都是纯质数,而 11, 13, 17, 19, 29, 31 不是纯质数。当然 1, 4, 35 也不是纯质数。
请问,在 1 到 20210605 中,有多少个纯质数?
解题思路:
此题目是一个质数筛题,暴力即可通过,题目要求所有数位都是质数并且该数是质数才可称为纯质数,所以我们要写两个函数,第一个函数是判断这个数的数位是不是质数,第二个函数判断这个数是否是质数,最后从2到2021065枚举出来就好了。(如果先判断质数再判断数位会很慢)
代码:
#include<bits/stdc++.h>
using namespace std;
bool pd(int n)//此函数为判断数位是否为质数
{
while(n)
{
int m = n%10;
if(m==0||m==1||m==4||m==6||m==8||m==9)//这些数不是质数 如果任何一位等于这几个数
{//直接返回false;
return false;
}
n/=10;
}
return true;
}
bool zhishu(int x)//此函数为判断质数的函数
{
for(int i=2;i<=sqrt(x);i++)//最简单的筛法
{
if(x%i==0)
{
return false;
}
}
return true;
}
int main()
{
int sum = 0;
for(int i=2;i<=20210605;i++)//枚举
{
if(pd(i)&&zhishu(i))//如果两个条件都满足了才算是纯质数
{
sum++;
}
}
cout<<sum;
return 0;
}
二、最少砝码
题目要求:
你有一架天平。现在你要设计一套砝码,使得利用这些砝码可以称出任意 小于等于 N 的正整数重量。
那么这套砝码最少需要包含多少个砝码?
注意砝码可以放在天平两边。
解题思路:
这道题可以用动态规划和找规律贪心来做,动态规划有点难了就不写了,这里写出来找规律的做法。
如果当n=1时,只用一个砝码就可以。
当n=2时候,我们要用两个砝码,两个重量为1的砝码即可,但是我们要贪心,我们可以选择更合适的1和3,因为3-1是2,这样范围就变成了1234。
当n=5的时候1 3就不行了,这个时候需要再加入一个砝码,能配合1 3表示5并且能满足贪心的砝码是9,最大的表示范围则是9+3+1=13。
此时我们就找到规律了,1*3=3,3*3=9,可能你觉得三个例子不够规律,那么如果要表达14,3*9=27,27-13=14,可以看得出规律了吧。
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int ans = 1,num = 1,sum = 1; //ans是保存用了几个砝码 num是新的砝码的重量 sum是砝码最高可以表示的值,因为如果n=1只有一种方法我们就初始化为1.
while(1)
{
if(sum>=n)//如果最高表示的值大于等于n
{
break;//跳出循环
}
ans++;//砝码+1
num *= 3;//砝码重量遵循上面的规律
sum += num;//sum加上新的砝码重量
}
cout<<ans;
return 0;
}
三、灌溉
题目要求:
小蓝负责花园的灌溉工作。
花园可以看成一个 n 行 m 列的方格图形。中间有一部分位置上安装有出水管。
小蓝可以控制一个按钮同时打开所有的出水管,打开时,有出水管的位置可以被认为已经灌溉好。
每经过一分钟,水就会向四面扩展一个方格,被扩展到的方格可以被认为已经灌溉好。即如果前一分钟某一个方格被灌溉好,则下一分钟它上下左右的四个方格也被灌溉好。
给定花园水管的位置,请问 kk 分钟后,有多少个方格被灌溉好?
解题思路:
这道题是道很简单的模拟,也可以多源bfs,但是咱们不是为了秀技术而是为了大家都能看懂,所以用模拟来做。
首先我们把n行m列的图形表示出来,比如3 6
000000
000000
000000
水管位置如果在2 2 3 4
000000
010000
000100
两个水管 一分钟之后
010000
111010
011110
灌溉了九个区域
相信大家都可以理解了灌溉过程 那么我们只需要设计一个灌溉上下左右四个方向的函数,定义一个保存数组,如果被灌溉了就把这个位置改为1,然后枚举即可,因为一分钟单独计算有点麻烦所以我们在输入的过程中就把它判断了,然后定义一个保存灌溉数量的变量,两层循环遍历整个区域,如果被灌溉了就加1,这样就ac了。
代码:
#include<bits/stdc++.h>
using namespace std;
int a[101][101];
int n,m,t,k,sum;//n和m是范围 t是水管数量 k是时间 sum是有多少方格被灌溉好
void dfs(int x,int y)
{
a[x][y]=1;//标记原地为1表示已经灌溉
//下面四个上下左右
if(!a[x-1][y])
{
a[x-1][y]=1;
}
if(!a[x+1][y])
{
a[x+1][y]=1;
}
if(!a[x][y-1])
{
a[x][y-1]=1;
}
if(!a[x][y+1])
{
a[x][y+1]=1;
}
}
int main()
{
cin>>n>>m;
cin>>t;
for(int i=1;i<=t;i++)
{
int x,y;
cin>>x>>y;//水管的位置
dfs(x,y);//一分钟就不拿出来单独算了 如果只有一分钟只有输入的水管位置上下左右会灌溉
//所以在输入的时候直接把水管所在的位置和其上下左右灌溉
}
cin>>k;
if(k>1)//如果时间超过一分钟
{
int num = k-1;//定义一个变量保存时间 上面做了一分钟的灌溉就
while(num--)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i][j])//查找所有的范围 如果被灌溉了就进入去灌溉该区域的上下左右
{
dfs(i,j);
}
}
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i][j])//如果被灌溉了 sum++ 最后就是总共的灌溉区域
{
sum++;
}
}
}
cout<<sum;
return 0;
}
如果觉得我的文章对你有帮助就给我来个关注点赞收藏吧~