按照书上解法二写出来的示例代码。算法的过程是排序-合并-二分查找-输出结果。思路比较清晰。 #include<iostream> #include<vector> #include<algorithm> using namespace std; class range { public: int x; int y; public: range(int xx,int yy):x(xx),y(yy){} friend bool operator <(range r1,range r2) { return r1.x<r2.x; } }; void print(vector<range> v) { for(int i=0;i<v.size();i++) { cout<<v[i].x<<" "<<v[i].y<<endl; } cout<<"--------"<<endl; } int main() { range r1(2,3); range r2(1,2); range r3(4,9); range r4(7,8); range r5(11,12); range val(1,6); vector<range> v; vector<range> vCombine; v.push_back(r1); v.push_back(r2); v.push_back(r3); v.push_back(r4); v.push_back(r5); print(v); sort(v.begin(),v.end()); print(v); //合并 int x=v[0].x,y=v[0].y; for(int i=1;i<v.size();i++) { if(v[i].x<=y&&v[i].y>y) y=v[i].y; else if(v[i].x<=y&&v[i].y<=y){} else { range tmp(x,y); vCombine.push_back(tmp); x=v[i].x; y=v[i].y; } } range tmp(x,y); vCombine.push_back(tmp); print(vCombine); //二分查找X小于等于val.x的所有range中X最大的range int p=0,q=vCombine.size()-1; int mid; //cout<<"p "<<p<<" q "<<q<<endl; while(p!=q) { mid=(p+q)/2; if(vCombine[mid].x<=val.x) p=mid; else q=mid; if(p==q-1) break; } //cout<<"p "<<p<<" q "<<q<<endl; int index; if(vCombine[q].x<=val.x) index=q; else index=p; if(vCombine[index].y>=val.y) cout<<" succes"; else cout<<"fail "; cout<<vCombine[index].x<<" "<<vCombine[index].y<<endl; system("pause"); return 1; }