题目的意思,给出一个序列,让你求一个最长的序列,序列里面最大与最小数之差不能超过k,然后问有几个这样的数列,打印出每个序列的开始位置与结束位置。
不过这道题我没有想出来,好伤心啊!然后看到别人的答案出现的multiset和vecot,才明白如果用容器来做这道题就很简单了。
#include <iostream> #include <cstdio> #include <cmath> #include <cstdlib> #include <iomanip> #include <algorithm> #include <cctype> #include <stack> #include <queue> #include <string> #include <cstring> #include <iomanip> #include <set> #include <vector> #include <cstdio> #include <stack> #include <sstream> #include <cstring> #include <map> using namespace std; const int INF=0x3f3f3f3f; int arr[100005]; multiset<int> set1; vector<pair<int,int> > res; int main() { int n,k; cin>>n>>k; int tmp=1,maxn=0; for(int i=1;i<=n;++i) { cin>>arr[i]; set1.insert(arr[i]); while(*set1.rbegin()-*set1.begin()>k) { set1.erase(set1.find(arr[tmp]));// tmp++; } if(maxn<i-tmp+1)//比较长度 { res.clear(); maxn=i-tmp+1; res.push_back(make_pair(tmp,i)); } else if(maxn==i-tmp+1) { res.push_back(make_pair(tmp,i)); } } printf("%d %d\n",maxn,res.size()); for(int i=0;i<(int)res.size();++i) printf("%d %d\n",res[i].first,res[i].second); return 0; }