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