1236:区间合并
我的思路是 先将每个区间以右边界按升序排序,因为要排序,并且两个边界要对应上,所以用结构体方便一些:
1 struct a 2 { 3 int x; 4 int y; 5 }; 6 a s[50010];
x是左边界,y是右边界。然后在通过s[1].y与s[2].x s[2].y与s[3].x ......s[n-1].y与s[n].x比较 若前者大,则合并这两个区间,若前者小,输出“no” 然后直接return 0;
1 for(int j=1;j<=n-1;++j) 2 { 3 if(s[j].y>=s[j+1].x) 4 { 5 s[j+1].x=min(s[j].x,s[j+1].x); 6 s[j+1].y=max(s[j].y,s[j+1].y); 7 } 8 else 9 { 10 cout<<"no"; 11 return 0; 12 } 13 }
为了防止有“[1,9],[2,5]”这样的区间,所以要定义min与max函数这样才能保证取到最大区间。
若有答案,则最终s[n].x与s[n].y就是区间的左右边界。
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 struct a 5 { 6 int x; 7 int y; 8 }; 9 a s[50010]; 10 int cmp(a p,a q) 11 { 12 return p.x<q.x; 13 } 14 int min(int x,int y) 15 { 16 return x<y? x:y; 17 } 18 int max(int x,int y) 19 { 20 return x>y? x:y; 21 } 22 int main() 23 { 24 int n; 25 cin>>n; 26 for(int i=1;i<=n;++i) 27 { 28 cin>>s[i].x>>s[i].y; 29 } 30 sort(s+1,s+n+1,cmp); 31 for(int j=1;j<=n-1;++j) 32 { 33 if(s[j].y>=s[j+1].x) 34 { 35 s[j+1].x=min(s[j].x,s[j+1].x); 36 s[j+1].y=max(s[j].y,s[j+1].y); 37 } 38 else 39 { 40 cout<<"no"; 41 return 0; 42 } 43 } 44 cout<<s[n].x<<" "<<s[n].y; 45 return 0; 46 }