貪心初探 51nod 1091 線段的重疊

貪心分析 : 這個題目是做的第一道貪心題目 給你一堆線段讓你求出來兩個相交最長的距離

我的策略是 : 從初始點開始進行排序 然後從小到大排序 最後用一個值來記錄前面的線段所能達到的最後邊 ,然後掃描新的線段 ,如果新的線段的end要比最遠的大,那麼試着用最遠的-這個點的開始點常識更新 並且更新最遠點 否則 這個長度一定完全在某一個區間內,嘗試更新即可

下面嘗試證明這個貪心策略是正確的

其實這個思路是用每一個跟前邊的所有的線段相交求最大 , 只不過由於我們優化只需要o1 首先我們找出最大所能到達的位置 , 那麼前邊的由於初始點一定在目前這個點或者在目前這個點左邊 所以 覆蓋的最大就是找出初始點和覆蓋最遠的點之間的距離 ,在這個時候 這個策略是最優的 ,然後依次這個樣子 ,就能找出來所有的最優。

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;
struct seg   {int start,length;}segment[60000];
int cmp(seg a,seg b) {return a.start<b.start;}
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        int endpoint;
        cin>>segment[i].start>>endpoint;
        segment[i].length=endpoint-segment[i].start;
    }//input
    sort(segment,segment+n,cmp);
    //sort  in order to do greedy
    int farest=segment[0].length+segment[0].start;
    int ans=0;
    for(int i=1;i<n;i++)
    {
         if(farest<=segment[i].start+segment[i].length)
         {ans=max(ans,farest-segment[i].start);farest=segment[i].start+segment[i].length;}
         else ans=max(ans,segment[i].length);
    }
    cout<<ans<<endl;
    return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章