贪心分析 : 这个题目是做的第一道贪心题目 给你一堆线段让你求出来两个相交最长的距离
我的策略是 : 从初始点开始进行排序 然后从小到大排序 最后用一个值来记录前面的线段所能达到的最后边 ,然后扫描新的线段 ,如果新的线段的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;
}