输入每头奶牛的身高,请问正中间的那头奶牛向前向后看,以为队伍的长度是多少?

第11题 看的最远
有N(奇数)只奶牛排成一行,为了安全2头最高大的奶牛排在队伍前端(最左边)和后端(最右边)。这些奶牛不习惯抬头,向前或向后看时,看到有和它同样高或比它高的奶牛就会被挡住视线,它会认为那就是最远的牛。
输入每头奶牛的身高,请问正中间的那头奶牛向前向后看,以为队伍的长度是多少?

输入格式
第一行1个奇整数:N,范围在[3,1000]。
第2行有N个不同的正整数,范围在[1,1000]。

输出格式
一个整数,队伍长度。

输入/输出例子1
输入:

9
20 5 10 4 10 6 1 8 20

输出:

7
解释:中间第5个高度为10的奶牛,最远只看到前面的高度为10的第3只奶牛和后面的高度为20的奶牛,以为队伍是 10 4 10 6 1 8 20

作答区域
#include
using namespace std;
int n,a[105],maxx;
int main(){
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
if(a[i]>a[maxx]) maxx=i;
int ans=1;
for(int i=maxx;i
if(a[i]>a[i+1]) ans++;
else break;
cout<

return 0;

}

思路:从中间开始向左一个一个比较遇到大于等于的停止,向右一个一个比较遇到大于等于的停止。
具体参考代码如下:

int main(){
    int n, a[105], mid;
    cin >> n;
    mid = n / 2;
    for(int i = 0; i < n; i++)
        cin >> a[i];
    int ans = 1;
    // 向左
    for(int i = mid - 1; i >= 0; i--) {
        ans++;
        if(a[i] >= a[mid])
            break;
    }
    // 向右
    for(int i = mid + 1; i < n; i++) {
        ans++;
        if(a[i] >= a[mid])
            break;
    }
    cout << ans << endl;
    return 0;
}

两条指针从中间开始一个左指针,一个右指针,分别往两边移动,当两指针移到了比中间牛高的牛就停止移动。之后中间位置减去左指针的位置(下标)得到向左长度,同理得到向右长度。最后取左,右两长度最大值即可