比赛详情:
通过这次的周赛让我受益颇多,这次的题目都是平常练习题目的变形,这次的竞赛是十分有意义的,加强对练习题的强化。
两道模拟题:
目录
1.熊孩子拜访
2.走楼梯
1.熊孩子拜访
题目描述
已知存在一个长度为n的整数序列A,A中所有元素通过从大到小的顺序进行排序,现在执行一段序列,请你找到A序列里面的倒置序列如果A序列中不存在倒置序列,输出0 0。
思路:从前往后找到a[i]>a[i+1]的位置,然后再找到a[i]<a[i-1]的位置。
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1e6+10;
int a[N];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
int ans=0,k,m;
int i=1,j=2;
while(a[i]<a[j]&&i<n) i++,j++;
k=i;
while(a[i]>a[j]&&i<n) i++,j++,ans++;
m=i;
if(ans==0) cout<<"0 0"<<endl;
else cout<<a[m]<<" "<<a[k]<<endl;
return 0;
}
2.走楼梯
题目描述
现在有一截楼梯,根据你的腿长,你一次能走1级或者两级楼梯,已知你要走n阶楼梯才能走到你的目的地,请你算出方案数。
样例输入1
4
样例输出1
5
样例输入2
5
样例输出2
8
斐波拉数列的变形,我们可以发现,f(i)=f(i-1)+f(i-2),用循环模拟递归。因为数据范围比较大,int无法通过,需要开long long。
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
int main()
{
int n;
cin>>n;
ll f1=1,f2=2,f;
if(n<=2) cout<<n;
else
{
for(int i=3;i<=n;i++)
{
f=f1+f2;
f1=f2;
f2=f;
}
cout<<f;
}
return 0;
}
如果此题目改成每次可以往前迈1,2,3,也是可以继续模拟的,我们可以发现f(i)=f(i-1)+f(i-2)+f(i-3),(i>=4),代码如下:
#include<iosteam>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
int main()
{
int n;
cin>>n;
ll f1=1,f2=2,f3=3,f;
if(n<=3) cout<<n;
else
{
for(int i=4;i<=n;i++)
{
f=f1+f2+f3;
f1=f2;
f2=f3;
f3=f;
}
cout<<f;
}
return 0;
}
我们可以用递归的方法,但是递归需要的存储空间太大,运行不出,只能用模拟递归方法。
如果n的值比较小,那么:
int f(int n)
{
if(n<=2) return n;
return f(i-1)+f(i-2);
}
非常感谢CSDN组织的比赛,在这次比赛之后,我会积极学习基础算法--枚举、贪心、分治、递归、搜索,图算法--最小生成树、数的遍历、最短路径、二分图、网络流等,动态规划,数据结构--线段树,并查集,数学知识--组合数学、数论、计算几何等算法。
但是自己对一些数据结构还是不太了解,代码的速度也是很慢的,是今年7月份开始接触算法,大一完全划水,非常感谢csdn组织的比赛。