Ilya and a Colorful Walk 解题报告
_Glassy_Sky_ · · 题解
题目链接
这道题目一到手,我首先想到的就是两重爆搜。先在输入过程中进行一个特判,判断如果所有的颜色都一样,输出
具体代码如下:
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 3e5 + 5;
int a[MAXN];
int main()
{
int n, ans = 0, sum = 0;
cin >> n;
cin >> a[1];
for(int i = 2; i <= n; i ++)
{
cin >> a[i];
if(a[i] == a[i - 1])//特判统计
sum ++;
}
if(sum == n - 1)//特判全部一样的情况
{
cout << 0;
return 0;
}
for(int l = 1; l <= n; l ++)//两层爆搜
for(int r = l; r <= n; r ++)
if(a[l] != a[r])
ans = max(ans, r - l);
cout << ans;
return 0;
}
但是这份代码交上去是会 TLE 的,为什么?因为
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 3e5 + 5;
int a[MAXN];
int main()
{
//freopen(".in", "r", stdin);
//freopen(".out", "w", stdout);
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
int n, sum = 0, ansl = 0, ansr = 0, ans = 0;
cin >> n;
for(int i = 1; i <= n; i ++)
{
cin >> a[i];
if(a[i] == a[i - 1])
sum ++;
}
if(sum == n - 1)//还是特判
{
cout << 0;
return 0;
}
for(int l = 1; l <= n; l ++)//从前往后扫
if(a[l] != a[n])
ansl = max(ansl, n - l);
for(int r = n; r >= 1; r --)//从后往前扫
if(a[r] != a[1])
ansr = max(ansr, r - 1);
ans = max(ansl, ansr);//两者最大值
cout << ans;
return 0;
}
放一个 AC 凭据吧。