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

被折叠的 条评论
为什么被折叠?



