貪心分析 : 這個題目是做的第一道貪心題目 給你一堆線段讓你求出來兩個相交最長的距離
我的策略是 : 從初始點開始進行排序 然後從小到大排序 最後用一個值來記錄前面的線段所能達到的最後邊 ,然後掃描新的線段 ,如果新的線段的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;
}