zoukankan      html  css  js  c++  java
  • 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
    ",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
    ",ans);
        }
        return 0;
    }

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

  • 相关阅读:
    Linux从入门到进阶全集——【第十四集:Shell编程】
    cmake 编译 c++ dll 的一个例子
    %1 不是有效的Win32应用程序
    C++ 生成 dll 和调用 dll 的方法实例(转)
    Clion cmake 一个简单的 C++ 程序
    一月4
    一月4日
    1月4日
    一月4日
    一月4日
  • 原文地址:https://www.cnblogs.com/kimsimple/p/7461252.html
Copyright © 2011-2022 走看看