P1420 最长连号
题目描述
输入 n 个正整数,要求输出最长的连号的长度。
连号指从小到大连续自然数。
输入格式
第一行,一个整数 n。
第二行,n 个整数 ai,之间用空格隔开。
输出格式
一个数,最长连号的个数。
输入输出样例
输入 #1
10 3 5 6 2 3 4 5 6 8 9
输出 #1
5
说明/提示
数据规模与约定
对于 100%的数据,保证 1<=n<=10^4 ,1<=ai<=10^9。
题解一:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int m,length(1),j(0),b[210];
cin>>m;
int a[m];
for(int i=0;i<m;i++)
{
cin>>a[i]; //将数据输入到一个数组中
}
for(int i=1;i<m;i++)
{
if(a[i]-a[i-1]==1)
{
length++; //连号长度
}
if(a[i]-a[i-1]!=1||i+1==m)
{
b[j]=length;
length=1; //清空length,重新记
j++;
}
}
sort(b,b+j); //快排
cout<<b[j-1]; //输出最大长度
return 0;
}
开辟了两个数组,使用了两次for循环,用了一次快排函数,还须考虑到如果最后两个数差也是1,无法存入b[j]数组,所以附加了条件i+1==m,题解较繁琐。
题解二:
#include<iostream>
using namespace std;
int Num,front,i,next,length=1,max;
int main()
{
cin>>Num>>front;
for(i=2;i<=Num;i++)
{
cin>>next;
if(next-front==1)
length++; //连号长度累加
else
length=1; //清空连号长度
if(length>max)
{
max=length; //存最大值
}
front=next; //交换,被减数作为新的减数
}
cout<<max;
return 0;
}
使用了一次for循环,用了两个变量做差,交换,没有使用数组,用max始终存储最大值,不需要排序,强于题解一。