牛客寒假算法基础集训营1 G 小a的排列

题目描述

链接:https://ac.nowcoder.com/acm/contest/317/G
来源:牛客网

思路:观察发现区间内l-r的长度与区间内最大值和最小值的差相等时,区间是‘萌’的

如果长度不相等的话,我们就要寻找l--,r++的数,并且在区间内的数加入要求的区间内;

 

代码如下:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 
 5 int main()
 6 {
 7     int n,x,y,l,r;
 8     int a[100005];
 9     while(cin >> n >> x >> y)
10     {
11         for(int i = 1;i <= n;i++)
12         {
13             cin >> a[i];
14             if(a[i] == x)
15             l = i;
16             if(a[i] == y)
17             r = i;
18         }
19         if(l > r)
20         swap(l,r);
21         bool flag;
22         int min1 = 0x3f3f3f,max1 = 0,l1,r1;
23         for(int i = l;i <= r;i++)
24         {
25             min1 = min(min1,a[i]);
26             max1 = max(max1,a[i]);
27         }
28         while(max1 - min1 != r - l)
29         {
30             l1 = 1,r1 = n;
31             while(l1 < l &&(a[l1] < min1 || a[l1] > max1))
32             l1++;//寻找最左边的l
33             //cout << l1 << "---";
34             while(r1 > r &&(a[r1] < min1 || a[r1] > max1))
35             r1--;
36             //cout << r1 << "--" << endl;
37             l = l1,r = r1;
38             for(int i = l;i <= r;i++)
39             {
40                 min1 = min(min1,a[i]);
41                 max1 = max(max1,a[i]);
42             }
43         }
44         cout << l << " " << r << endl;
45     }
46     return 0;
47 }

 

posted @ 2019-02-06 22:42  lu_nacy  阅读(157)  评论(0编辑  收藏  举报