目录
1.猴子分香蕉
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
5 只猴子是好朋友,在海边的椰子树上睡着了。这期间,有商船把一大堆香蕉忘记在沙滩上离去。
第 1 只猴子醒来,把香蕉均分成 5 堆,还剩下 1 个,就吃掉并把自己的一份藏起来继续睡觉。
第 2 只猴子醒来,把香蕉均分成 5 堆,还剩下 2 个,就吃掉并把自己的一份藏起来继续睡觉。
第 3 只猴子醒来,把香蕉均分成 5 堆,还剩下 3 个,就吃掉并把自己的一份藏起来继续睡觉。
第 4 只猴子醒来,把香蕉均分成 5 堆,还剩下 4 个,就吃掉并把自己的一份藏起来继续睡觉。
第 5 猴子醒来,重新把香蕉均分成 5 堆,哈哈,正好不剩!
请计算一开始最少有多少个香蕉。
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
思路:
填空题,直接根据题意暴力求解,注意第五只猴子分香蕉时香蕉的数量不能为0
AC代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int n,i;
int main(){
for( i=1;;i++){
int n=i;
if(n%5==1){
n=n-(n/5)-1;
if(n%5==2){
n=n-(n/5)-2;
if(n%5==3){
n=n-(n/5)-3;
if(n%5==4){
n=n-(n/5)-4;
if(n%5==0&&(n/5)!=0){
cout<<i;
return 0;
}
}
}
}
}
}
return 0;
}
2.等差数列
题目描述
数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一 部分的数列,只记得其中 N 个整数。
现在给出这 N个整数,小明想知道包含这 N 个整数的最短的等差数列有几项?
输入描述
输入的第一行包含一个整数 N。
第二行包含 N 个整数 A1,A2,··· ,AN。(注意 A1 ∼ AN 并不一定是按等差数列中的顺序给出)
其中,2<=N<=, 0<=Ai<=
输出描述
输出一个整数表示答案。
示例:
输入
5
2 6 4 10 20
输出
10
样例说明: 包含 2、6、4、10、20 的最短的等差数列是 2、4、6、8、10、12、14、16、 18、20。
思路
最开始我的思路是先对序列进行排序,再找出所有值的最小差值,通过公式:
等差数列的任意两项之差为公差的倍数 可得到 项数=(最大值-最小值)/公差+1;
然后在蓝桥杯练习系统里评测只得到70分(原因:最小差值不一定被其他差值整除,某些样例会出错)
之后我采用最大公约数gcd进行优化,找到所有差值的最大公约数即是最大公差,可使等差序列最短。
注意:当存在差值为0时,公差就为0,即所有项相同,有n个数
0与任意数的最大公约数都是其本身
AC代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5+10;
int n;
int res;
int a[N];
int Min=0;
int i,j;
int gcd(int a, int b){//求最大公约数
return b ? gcd(b, a % b) : a;
}
int main()
{
cin>>n;
for( i=0;i<n;i++) cin>>a[i];
sort(a,a+n);//递增排序
int Min = 0; //0与任意数的最大公约数都是其本身
for (int i = 0; i < n - 1; i ++ )
Min = gcd(Min, a[i + 1] - a[i]);
if (Min==0) res=n; //公差为0时
else res=((a[n-1] - a[0]) / Min + 1);
cout<<res;
return 0;
}
3、平方序列
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小明想找到两个正整数 X 和Y,满足
- 2019 < X < Y;
- 组成等差数列。
请你求出在所有可能的解中,X + Y的最小值是多少?
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
思路
暴力枚举(在Dev里跑了3秒多)
AC代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
//2019*2019=4076361
ll Min=9999999;
int main(){
for(ll x=2020;x<=99999;x++){
for(ll y=x+1;y<=99999;y++){
if(y*y-x*x==x*x-2019*2019){
Min=min(x+y,Min);
}
}
}
cout<<Min;
return 0;
}
4.倍数问题
题目描述
众所周知,小葱同学擅长计算,尤其擅长计算一个数是否是另外一个数的倍数。但小葱只擅长两个数的情况,当有很多个数之后就会比较苦恼。现在小葱给了你 n 个数,希望你从这 n 个数中找到三个数,使得这三个数的和是 K 的倍数,且这个和最大。数据保证一定有解。
输入描述
第一行包括 2 个正整数 n, Kn, K。
第二行 n 个正整数,代表给定的 n 个数。
其中,,,给定的n个数不超过
输出描述
输出一行一个整数代表所求的和。
输入
4 3
1 2 3 4
输出
9
思路
第一次暴力尝试超时,
纯暴力解法 :超时
(过了部分案例混了60分)
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N=1e5+10 ;
typedef long long ll;
ll a[N];
int n,m;
ll ans=0;
int main(){
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
scanf("%lld",&a[i]);
}
for(int i=0;i<n;i++){
for(int j=0;j<n&&i!=j;j++){
for(int k=0;k<n&&j!=k&&i!=k;k++){
ll sum=a[i]+a[j]+a[k];
if(sum>ans&&sum%m==0){
ans=sum;
}
}
}
}
printf("%lld",ans);
return 0;
}
dp解法
正在学习中