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 }

猜你喜欢

转载自www.cnblogs.com/zkw666/p/12377567.html