一、猴子分香蕉
题目链接:猴子分香蕉 - 蓝桥云课 (lanqiao.cn)
题目要求:
5 只猴子是好朋友,在海边的椰子树上睡着了。这期间,有商船把一大堆香蕉忘记在沙滩上离去。
第 1 只猴子醒来,把香蕉均分成 5 堆,还剩下 1 个,就吃掉并把自己的一份藏起来继续睡觉。
第 2 只猴子醒来,把香蕉均分成 5 堆,还剩下 2 个,就吃掉并把自己的一份藏起来继续睡觉。
第 3 只猴子醒来,把香蕉均分成 5 堆,还剩下 3 个,就吃掉并把自己的一份藏起来继续睡觉。
第 4 只猴子醒来,把香蕉均分成 5 堆,还剩下 4 个,就吃掉并把自己的一份藏起来继续睡觉。
第 5 猴子醒来,重新把香蕉均分成 5 堆,哈哈,正好不剩!
请计算一开始最少有多少个香蕉。
解题思路:
按照题意暴力模拟即可,注意 每次藏一份根据剩下的来藏 而不是藏一个,踩过坑。
#include<bits/stdc++.h> using namespace std; int main() { int a = 6; while(1) { if(a%5==1) { int i = a-(a-1)/5; i -= 1; if(i%5==2) { int i2 = i-(i-2)/5; i2=i2-2; if(i2%5==3) { int i3=i2-(i2-3)/5; i3=i3-3; if(i3%5==4) { int i4=i3-(i3-4)/5; i4=i4-4; if(i4%5==0&&i4!=0) { cout< return 0; } } } } } a++; } }
二、等差数列
题目链接:等差数列 - 蓝桥云课 (lanqiao.cn)
题目要求:
数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一 部分的数列,只记得其中 N 个整数。
现在给出这 N 个整数,小明想知道包含这 N 个整数的最短的等差数列有几项?
解题思路:
很简单的一道题,先排序找出最小的差,它就是等差数列的差,要注意判断一下是否为0,看代码!
#include<bits/stdc++.h> using namespace std; //就是对它先排序找出最小的差,那就是等差数列差, //要注意的一点就是要判断一下它的差是不是0,如果是0的话最小就是n个。 int a[100001]; int main() { int n; cin>>n; int x = INT_MAX; for(int i=0;i { cin>>a[i]; } sort(a,a+n); for(int i=1;i { x = min(a[i]-a[i-1],x);//找到最小的差 就是等差数列的差 } if(!x) { cout< } else { int sum = (a[n-1]-a[0])/x+1;//如果不是0 那就让最大的数-最小的数并且除以该差+1 cout<<sum; } return 0; }
三、平方序列
题目链接:平方序列 - 蓝桥云课 (lanqiao.cn)
题目要求:
小明想找到两个正整数 X 和 Y,满足
1.2019 < X < Y
2.2019^2, X^2, Y^2 组成等差数列。
请你求出在所有可能的解中,X + Y 的最小值是多少?
解题思路:
这个也是暴力题,按照题意模拟即可。
#include<bits/stdc++.h> using namespace std; int main() { for(int i=2020;i<10001;i++) { int x = i*i*2-2019*2019; int y = sqrt(x); if(y*y==x) { cout<<i+y; return 0; } } }
四、倍数问题
题目链接:倍数问题 - 蓝桥云课 (lanqiao.cn)
题目要求:
众所周知,小葱同学擅长计算,尤其擅长计算一个数是否是另外一个数的倍数。但小葱只擅长两个数的情况,当有很多个数之后就会比较苦恼。现在小葱给了你 n 个数,希望你从这 n 个数中找到三个数,使得这三个数的和是 K 的倍数,且这个和最大。数据保证一定有解。
解题思路:
可以用二维数组加双层循环遍历和剪枝AC,直接看代码吧,我在代码里模拟两边 写了注释 大家理解一下自己代入值体验一下代码怎么跑的就懂了。
#include<bits/stdc++.h> using namespace std; int f[1003][3]; long long maxx,a,b,c; int main() { int n,k;4 3 cin>>n>>k; for(int i=0;i { int x; cin>>x;//1 2 3 4 int m = x%k;//1除3的余数1 2%3=2 3%3 = 0 4%3 = 1 if(x>f[m][0])//1大于f[1][0] 2大于f[2][0] 3大于f[3][0] 4大于f[1][0] { f[m][2] = f[m][1];//维护 更新最大 第二大 第三大的值 f[m][1] = f[m][0]; f[m][0] = x; //f[1][0] = 1 f[2][0] = 2 f[0][0] = 3 f[1][0]从1变4 } else if(x>f[m][1]) { f[m][2] = f[m][1]; f[m][1] = x; } else if(x>f[m][2]) { f[m][2] = x; } } for(int i=0;i { for(int j=0;j {//a + b + c%k = (a%k + b%k + c%k) %k //所以知道前两个就能得出来第三个的余数 第三个值为k-a%k+k-b%k //如果觉得难理解可以看看 a+b+c=d 求第三个数就是 d-a-b=c int kk = (k-i+k-j)%k;//得到第三个余数这三个余数凑为k的倍数 第二次得到为2 a = f[i][0]; //f[0][0]是0 f[0][0]还是0 if(i==j)//0=0 0!=1 { b = f[i][1];//f[0][1]也是0 if(i==kk)//现在的kk是2 不相等 { c = f[i][2]; } else { c = f[kk][0];//c = f[2][0](2) } } else { b = f[j][0];//b = f[1][0] = 4 if(i==kk)//0!=2 { c = f[i][1]; } else if(j==kk)//1!=2 { c = f[j][1]; } else//c = f[2][0] = 2 { c = f[kk][0]; } } if(a+b+c>maxx)//0+0+2大于maxx 0+4+2大于2 maxx = 6 { maxx = a+b+c; } } } cout<<maxx; return 0; }