贪心初探 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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值