灵山之上神风起
根据题目描述,首先可以证明的是,选取的
这是因为,当选取了
因此得出,选择的节点中,
若选择一个
若选择两个
综上所述,我们所选取的节点有如下可能:
- 选取所有
a_i=1 的点; - 选取最左边的
a_i=2 的点,再选取所有其右边的a_i=1 的点; - 选取最右边的
a_i=3 的点,再选取所有其左边的a_i=1 的点; - 选取最左边的
a_i=2 的点和最右边的a_i=3 的点,再选取所有其中间的a_i=1 的点。
四种情况分别讨论一下看哪一个选取的点更多。注意第四种情况下需要判断最左边的
2
3 2
参考代码:
#include <iostream>
using namespace std;
int n,a[100050],l,r;
int main()
{
cin >> n;
for (int i=1;i<=n;i++)
cin >> a[i];
for (int i=1;i<=n;i++)
{
if (a[i]==2)
{
l=i;
break;
}
}
for (int i=n;i>=1;i--)
{
if (a[i]==3)
{
r=i;
break;
}
}
int ans=0;
if (l)
{
int ret=1;
for (int i=l+1;i<=n;i++)
ret+=(a[i]==1);
ans=max(ans,ret);
}
if (r)
{
int ret=1;
for (int i=1;i<=r-1;i++)
ret+=(a[i]==1);
ans=max(ans,ret);
}
if (l && r && r>l)//第四种情况的特判
{
int ret=2;
for (int i=l+1;i<=r-1;i++)
ret+=(a[i]==1);
ans=max(ans,ret);
}
int ret=0;
for (int i=1;i<=n;i++)
ret+=(a[i]==1);
ans=max(ans,ret);
cout << ans << endl;
return 0;
}