Codeforces Round #616 (Div. 2) B. Array Sharpening

t题目链接:http://codeforces.com/contest/1291/problem/B

思路:

用极端的情况去考虑问题,会变得很简单。

无论是单调递增,单调递减,或者中间高两边低的情况都可以变为三种模型。

(1)0,1,2,3,4........n-3,n-2,n-1

(2)n-1,n-2,n-3.....3,2,1,0

(3)0,1,2,3,4,.....n.......4,3,2,1,0

那么,我们只需要查看当前位置是否大于等于极端模型(3)在这个位置的数值,如果当前位置不满足了,

那么我们就让当前位置和之后的数值去和极端模型(3)n后面递减的数值去比较,如果还有不满足的情况说明就是“NO”了。

注意一种情况 0 1 1 0需要特殊处理一下。

 1 #include <iostream>
 2 using namespace std;
 3 
 4 const int N = (int)3e5+100;
 5 int a[N];
 6 
 7 int main(){
 8 
 9     int T,n;
10     while(cin >> T){
11         while(T--){
12             cin >> n;
13             for(int i = 1; i <= n; ++i) cin >> a[i];
14             int i;
15             bool ok = 1;
16             //递增区间判断
17             for(i = 1; i <= n; ++i){
18                 if(a[i] >= i-1) continue;
19                 break;
20             }
21             // 0 1 1 0 这种情况判定
22             if(i <= n){
23                 if(a[i] == a[i-1] && !(a[i] >= n-i+1)) ok = 0;
24             }
25             //递减区间判定
26             for(; i <= n; ++i){
27                 if(a[i] >= n-i) continue;
28                 ok = 0; break;
29             }
30             //if(ok) cout << "----------Yes" << endl;
31             //else cout << "----------No" << endl;
32             if(ok) cout << "----------Yes" << endl;
33             else cout << "----------No" << endl;
34         }
35     }
36 
37 }

 

posted @ 2020-02-04 15:53  SummerMingQAQ  阅读(...)  评论(...编辑  收藏