题意:找到一个序列中极值<=k的最长字串的长度。
解题思路:set容器双递推。
解题代码:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 // File Name: g.cpp 2 // Author: darkdream 3 // Created Time: 2015年03月28日 星期六 12时04分39秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bitset> 12 #include<algorithm> 13 #include<functional> 14 #include<numeric> 15 #include<utility> 16 #include<sstream> 17 #include<iostream> 18 #include<iomanip> 19 #include<cstdio> 20 #include<cmath> 21 #include<cstdlib> 22 #include<cstring> 23 #include<ctime> 24 #define LL long long 25 #define maxn 100005 26 using namespace std; 27 multiset<int> st; 28 int n , k ; 29 int a[maxn]; 30 int main(){ 31 while( scanf("%d %d",&n,&k) != EOF) 32 { 33 int mx = 1; 34 st.clear(); 35 for(int i = 1 ;i <= n;i ++) 36 { 37 scanf("%d",&a[i]); 38 } 39 for(int i = 1,j = 1; i <= n;i ++) 40 { 41 st.insert(a[i]); 42 for(;*st.rbegin()-*st.begin() > k ; j ++) 43 { 44 st.erase(st.find(a[j])); 45 } 46 if(i - j +1 >= mx) 47 mx = i-j+1; 48 } 49 printf("%d\n",mx); 50 } 51 return 0; 52 }