zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    cd的使用
    转换器模式
    装饰模式
    策略模式
    模板方法模式
    工厂模式
    类型信息
    proto编译组件使用
    proto编译引用外部包问题
    Kafka经典三大问:数据有序丢失重复
  • 原文地址:https://www.cnblogs.com/zkw666/p/12377567.html
Copyright © 2011-2022 走看看