【思特奇杯·云上蓝桥-算法集训营】第1周

本文解析了蓝桥杯比赛中的三个问题:跑步训练中避免体力异常、阶乘约数计算的优化策略,以及出栈次序的卡特兰数应用。通过实例展示了如何修正易错算法并提高效率,涉及核心知识点如动态规划、质因数分解和递归计算。

蓝桥杯训练专用

1.跑步训练

易错点

如果把 跑一次且休息一次 作为一个周期去算,到最后几轮可能会出现 跑了超过10000体力,休息一下又小于10000体力 的情况,这显然不应该出现 ,按此错误思路算得答案 3970
思路:
    1.先考虑最后一次跑步的情况,由于只有跑步,只需更新累计秒数,跑够10000体力直接break 
    2.如果不是情况1,说明是情况2,那每次跑步必定跑满一分钟,无脑更新 累计体力和累计秒数 即可 ,答案:3880 

#include<bits/stdc++.h>
using namespace std;
/*
易错点:如果把 跑一次且休息一次 作为一个周期去算,
		到最后几轮可能会出现 跑了超过10000体力,休息一下又小于10000体力 的情况,这显然不应该出现 
		按此错误思路算得答案 3970
思路:
	1.先考虑最后一次跑步的情况,由于只有跑步,只需更新累计秒数,跑够10000体力直接break 
	2.如果不是情况1,说明是情况2,那每次跑步必定跑满一分钟,无脑更新 累计体力和累计秒数 即可 
	答案:3880 
*/
 
int main(){
	int sum = 0;//累计体力,初始为0 
	int sec = 0;//累计秒数 
	while(1){
		if(sum + 600 >= 10000){//退出循环条件:最后一次跑步 
			sec += (10000-sum)/10;
			break;
		}
		else{
			//由于进入了else,所以肯定不是最后一次跑,因次每次跑满一分钟 
			sum += 600;
			sec += 60;
			//开始休息 
			sum -= 300;
			sec += 60;
		}
	} 
	cout<<sec; 
	return 0;
}

2.阶乘约数

对阶乘的每一个数进行质因数分解,最后再进行合并,利用性质得出答案

算数基本定理
任意一个正整数 X 都可以表示成若干个质数乘积的形式,即 

X = p1^a1 ∗ p2^a2 …… ∗pn^an 

(其中p1~pn为互不相同的质数(互质),a1~an为这些质数的指数)

性质

根据算术基本定理得

        约数个数 = (a1 + 1)(a2 + 1)……(an + 1)

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll p[1000];
//答案:39001250856960000
int main(){
	int n;
	cin>>n;
	for(int i=2;i<=n;i++){//对阶乘的每个数质因数分解 
		int x=i;
		for(int j=2;j*j<=n;j++){//遍历阶乘当前这个数x时,对他进行质因数分解 
			while(x%j==0){
				p[j]++;
				x/=j;
			} 
		}
		if(x>1)	p[x]++;//x>1说明还有剩余的质因子 
	}
	ll ans=1;
	for(int i=2;i<=n;i++){
		if(p[i]>0)	ans*=(1+p[i]);
	} 
	cout<<ans<<endl;
	return 0;
} 

3.出栈次序

该过程为卡特兰数的入门应用,非常经典,直接用卡特兰数算即可。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
//答案:35357670
#define MAXN 20
int C[MAXN][MAXN];
int n=16;

int main(){
	for(int i = 1; i <= 2*n; ++i)//动态规划打表计算卡特兰数 
    {
        C[i][0] = C[i][i] = 1;
        for(int j = 1; j < i; ++j)
        {
            C[i][j] = C[i-1][j-1] + C[i-1][j];
        }
    }
    
    printf("%d ", C[2*n][n] - C[2*n][n+1]);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小小的香辛料

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

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

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

打赏作者

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

抵扣说明:

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

余额充值