题目大意:给你一个非负整数数列a1到an,你能对数列中的成员进行不断减小直到0,问能否存在有且仅有一个点k(1≤k≤n)使数列满足a1<a2<…< ak且ak>ak+1>…>an (就是类似于一个菱形的数组)
思路:先找出左端的临界情况(0<1<2<3<4…<k),可以看出左端的每一个成员必须要满足a[i]>=i这个条件,所以先遍历一遍,当存在i不满足条件时,这个i-1就是k。那么右边类似的(k>…>4>3>2>1>0),右边的每一个成员必须要满足a[i]<n-1-j这个条件
代码:
#include <stdio.h>
int num[300030];
int main(){
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
for(int i = 0;i < n;i++){
scanf("%d",&num[i]);//输入
}
int i=0;
while(i<n&&num[i]>=i){
i++;//遍历,查找出k
}
int flag=1;
for(int j = i-1;j < n;j++){//k为i-1,因为i已经不满足条件了,只能为右端
if(num[j]<n-1-j){
flag=0;//如果有成员不满足就直接break,flag标记一下
break;
}
}
if(flag) printf("Yes\n");
else printf("No\n");
}
}