【题解】B2097 最长平台
Dimly_dust · · 题解
Part 1
观察题目后可得结论(自行证明):
- 两个相邻平台中必定交界处的两个元素不同
有了这个结论题目就好做多了,下面介绍几种做法。
Algorithm 1
采用
时间复杂度
Code
#include <bits/stdc++.h>
using namespace std;
int f[105],a[105];
inline int read()
{
int x=0,f=1;
char ch=getchar();
while (ch<'0'||ch>'9')
{
if (ch=='-') f=-1;
ch=getchar();
}
while (ch>='0'&&ch<='9')
{
x=x*10+ch-48;
ch=getchar();
}
return x*f;
}
int main()
{
int n=read(),maxn=-1;
for(int i=1;i<=n;i++)
a[i]=read();
for(int i=1;i<=n;i++)
{
if(a[i]==a[i-1]) f[i]=f[i-1]+1; //不用处理f[0]是因为a是大于0的正整数
else
{
f[i]=1;
maxn=max(maxn,f[i-1]);
}
}
printf("%d",maxn);
return 0;
}
Algorithm 2
那么我们思考一下,怎么优化呢?
可以发现每一个平台长度
既然计算只涉及到
时间复杂度
Code
#include <bits/stdc++.h>
using namespace std;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while (ch<'0'||ch>'9')
{
if (ch=='-') f=-1;
ch=getchar();
}
while (ch>='0'&&ch<='9')
{
x=x*10+ch-48;
ch=getchar();
}
return x*f;
}
int main()
{
int n=read(),maxn=-1,len=1;
int k=read();
for(int i=2; i<=n; i++)
{
int j=read();
if(j==k) len++;
else
{
maxn=max(maxn,len);
len=1;
}
k=j;
}
printf("%d",maxn);
return 0;
}