51Nod 1091 线段重叠 | 贪心

 

 

Input示例
5
1 5
2 4
2 8
3 7
7 9
Output示例
4


 first try:

O(n^2):二层循环,减法取最大

后五个time limit exceeded

#include "bits/stdc++.h"
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f3f
#define PI acos(-1)
#define N 50010
#define MOD 10
using namespace std;
struct unit{
    int s,e;
}arr[N];
bool cmp(struct unit&a,struct unit&b){//起点升序终点升序
    if(a.s==b.s)
        return a.e<b.e;
    return a.s<b.s;
}
int main()
{
    int n,t,m;
    while(~scanf("%d",&n)){
         for(int i=0;i<n;i++){
            scanf("%d%d",&arr[i].s,&arr[i].e);
         }
         sort(arr,arr+n,cmp);
         int MAX=-INF,tt;
         for(int i=0;i<n;i++){
            for(int j=i+1;j<n;j++){
                if(arr[j].e>=arr[i].e)
                    tt=arr[i].e-arr[j].s;
                else
                    tt=arr[j].e-arr[j].s;
                MAX=MAX>tt?MAX:tt;
            }
         }

         if(MAX<0){
            puts("0");
         }
         else
            printf("%d\n",MAX);
    }
    return 0;
}

 

second try:

线扫(线性扫一遍O(n))

以起点升序,终点降序排列。线性扫一遍,贪心取最大值。

#include "bits/stdc++.h"
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f3f
#define PI acos(-1)
#define N 50010
#define MOD 10
using namespace std;
struct unit{
    int s,e;
}arr[N];
bool cmp(struct unit&a,struct unit&b){
    if(a.s==b.s)
        return a.e>b.e;
    return a.s<b.s;
}
int main()
{
    int n,t,m;
    while(~scanf("%d",&n)){
         for(int i=0;i<n;i++){
            scanf("%d%d",&arr[i].s,&arr[i].e);
         }
         sort(arr,arr+n,cmp);
         int ans=0;
         int ed=arr[0].e;
         for(int i=1;i<n;i++){
            ans=max(ans,min(ed,arr[i].e)-arr[i].s);
            ed=max(ed,arr[i].e);
         }
        printf("%d\n",ans);
    }
    return 0;
}

 

参考:http://blog.csdn.net/zchahaha/article/details/51605707

posted @ 2017-09-01 00:36  kimsimple  阅读(131)  评论(0编辑  收藏  举报