UVa:1133 Rent your airplane and make money

dp[i]表示从终止时间到第i个order结束的最大利润。

二分查找第一个大于等于第i个order结束时间的开始时间。

暂时先贴上代码,题解慢慢写。

 

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include <algorithm>
#define maxn 3005
using namespace std;
struct Segment
{
    int l,r,w;
    bool operator < (const Segment x) const
    {
        if(l==x.l) return r<x.r;
        return l<x.l;
    }
};
int n;
int dp[maxn];
Segment seg[maxn];
int search(int key)
{
    int low=key,high=n,mid=(low+high)/2;
     while (high > low)
    {
        if (seg[mid].l >= seg[key].r)
            high = mid;
        else
            low = mid + 1;
        mid = (low + high) / 2;
    }
    return mid;
}
int main()
{
    int kase=0;
    while(scanf("%d",&n)!=EOF)
    {
        char str[100];
        if(kase) printf("\n");
        for(int i=0; i<n; ++i)
        {
            scanf("%s%d%d%d",str,&seg[i].l,&seg[i].r,&seg[i].w);
            seg[i].r+=seg[i].l;
        }
        memset(dp,0,sizeof(dp));
        sort(seg,seg+n);
        for(int i=n-1; i>=0; --i)
        {
            int L=search(i);
            dp[i]=max(dp[i+1],dp[L]+seg[i].w);
        }
        printf("%d\n",dp[0]);
        kase++;
    }
    return 0;
}


 

你可能感兴趣的:(动态规划,二分法)