1、有趣的数字
题目描述:我们称一个数是质数,而且数位中出现了 55 的数字是有趣的。例如 5, 59, 4575,59,457 都是有趣的,而 15, 715,7 不是。求 11 到 100000100000 中有趣的数的个数。
思路:这道题就是判断质数,和分解数字,通过for循环对1~100000的每一个数进行判断。
考点:判断质数、分解数字
#include
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<
2、爬楼梯
题目描述:蒜头君要爬楼梯。楼梯一共有 1010 层台阶。因为腿长的限制,每次最多能上 44 层台阶。但是第 5,75,7 层楼梯坏掉了不能踩。求上楼梯的方案数。
思路:达到第某一层可以通过上1层、2层、3层,4层实现。那么从第十层开始逐层往下考虑。
考点:递归
#include
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<
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
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<
6、寻找重复项
题目描述:
第一行三个整数 A,B,CA,B,C 。
输出一行一个整数表示答案。
样例输入
2 2 9
样例输出
4
思路:这道题的思路就是,把每个数组的值计算出来,存到map里,每次计算出后先查找是否已经map里存有。若有,返回数组下标,没有用map标记一下然后继续计算下一个。不过由于时间限制,这里要用unordere_map,顾名思义,用法和map一样,就是这个是无序的,map会自动排序,这道题不需要排序,只需要速度够快就可。
#include
using namespace std;
const int maxn=2e6+5;
typedef long long ll;
unordered_map 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<