码迷,mamicode.com
首页 > 其他好文 > 详细

51node1091(贪心)

时间:2017-01-10 21:22:14      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:tar   更新   简单   c++   代码   efi   坐标   数据存储   ace   

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1091

 

题意:中文题诶~

 

思路:贪心;

我们先将数据按照左端点升序排列,对于左端点一样的区间我们再按照右端点升序排列;其实对于左端点相同的区间影响答案的只是其中右端点最大的那个区间,我们可以将右端点坐标较小的区间去掉,不过那样操作比较麻烦,就不必去掉他们啦.这点很简单,就不细说了;

假设我们将排序后的数据存储到gg结构体数组中,我们先令end=gg[0].right, ans=0,ans存储但前最大公共区间值;那么在gg[0]后面的区间与gg[0]有三种关系:

1:gg[i].left>end, 即gg[i]与gg[0]不相交.此时我们要更新end=gg[i].end,因为我们是按照left升序怕排列gg的,所以在当前情况下gg[0]后面的区间都不会与gg[0]相交啦;

2:gg[i].left<end,此种情况根据gg[i].right的大小又可以细分两种情况:

  a: gg[i].right<end, 此时我们需要检查是否要更新ans, ans=max(ans, end-gg[i].left);

  B: gg[i].right>=end,此时我们不仅要更新ans, 还要更新end, end=gg[i].right;

如此遍历完gg数组,ans就是我们要的答案啦;

 

代码:

 1 #include <bits/stdc++.h>
 2 #define MAXN 50010
 3 using namespace std;
 4 
 5 struct node{
 6     int left, right;
 7 };
 8 
 9 bool cmp(node a, node b){
10     return a.left==b.left?a.right<b.right:a.left<b.left;
11 }
12 
13 int main(void){
14     int n;
15     node gg[MAXN];
16     cin >> n;
17     for(int i=0; i<n; i++){
18         cin >> gg[i].left >> gg[i].right;
19     }
20     sort(gg, gg+n, cmp);
21     int ans=0, end=gg[0].right;
22     for(int i=1; i<n; i++){
23         if(gg[i].left<end){
24             if(gg[i].right<end){
25                 ans=max(ans, gg[i].right-gg[i].left);
26             }else{
27                 ans=max(ans, end-gg[i].left);
28                 end=gg[i].right;
29             }
30         }else{
31             end=gg[i].right;
32         }
33     }
34     cout << ans << endl;
35     return 0;
36 }

 

51node1091(贪心)

标签:tar   更新   简单   c++   代码   efi   坐标   数据存储   ace   

原文地址:http://www.cnblogs.com/geloutingyu/p/6270608.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!