蓝桥冲刺31天打卡—Day5

目录

1.猴子分香蕉

题目描述

思路:

 AC代码

2.等差数列

题目描述

思路 

AC代码

3、平方序列

题目描述

思路

AC代码 

4.倍数问题 

题目描述


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<=10^5, 0<=Ai<=10^9

输出描述

输出一个整数表示答案。

示例:

输入

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,满足

  1. 2019 < X < Y;
  2. 2019^2,X^2,Y^2组成等差数列。 

请你求出在所有可能的解中,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 个数。

其中,1<=n<=10^5,1<=K<=10^3,给定的n个数不超过10^8

输出描述

输出一行一个整数代表所求的和。

输入

4 3

1 2 3 4

输出

思路

第一次暴力尝试超时,

纯暴力解法 :超时

 (过了部分案例混了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解法

正在学习中

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月色美兮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值