项目安排

时间限制:3000 ms  |  内存限制:65535 KB
难度:4
描述
小明每天都在开源社区上做项目,假设每天他都有很多项目可以选,其中每个项目都有一个开始时间和截止时间,假设做完每个项目后,拿到报酬都是不同的。由于小明马上就要硕士毕业了,面临着买房、买车、给女友买各种包包的鸭梨,但是他的钱包却空空如也,他需要足够的money来充实钱包。万能的网友麻烦你来帮帮小明,如何在最短时间内安排自己手中的项目才能保证赚钱最多(注意:做项目的时候,项目不能并行,即两个项目之间不能有时间重叠,但是一个项目刚结束,就可以立即做另一个项目,即项目起止时间点可以重叠)。
输入
输入可能包含多个测试样例。
对于每个测试案例,输入的第一行是一个整数n(1<=n<=5000):代表小明手中的项目个数。
接下来共有n行,每行有3个整数st、ed、val,分别表示项目的开始、截至时间和项目的报酬,相邻两数之间用空格隔开。
st、ed、value取值均在32位有符号整数(int)的范围内,输入数据保证所有数据的value总和也在int范围内。
输出
对应每个测试案例,输出小明可以获得的最大报酬。
样例输入
  1. 3
  2. 1 3 6
  3. 4 8 9
  4. 2 5 16
  5. 4
  6. 1 14 10
  7. 5 20 15
  8. 15 20 8
  9. 18 22 12
样例输出
  1. 16
  2. 22
提示
上传时数据加强,项目起始时间和终止时间可能相同(其他oj可能无此情况)
来源
网易有道2013年校园招聘面试二面试题
上传者
勿念情
感觉N^2也可以过啊,T了,后来用的二分A掉,二分写炸了调了半天最后发现排序小标写错了,ccc
dp[i]表示前i个项目可获得的最大价值,则dp[i]=max(dp[i-1],solve(i-1)+P[i].val)
solve()就是我们要找的在满足与目标项目不交叉的情况下的最大价值。
由于要二分查找显然dp[]数组必须有序,所以dp[i]表示前i个项目可获得的最大价值,这样的话二分找到的某个合法项目之前的项目显然也在目标项目之前且不交叉。
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f;
struct node
{
    int st,ed,val;
    bool operator<(const node &c)const{
    if(st==c.st&&ed==c.ed) return val>c.val;
    if(ed==c.ed) return st<c.st;
    return ed<c.ed;
    }
}P[5005];
int dp[5005];
int solve(int t)
{
    if(!t) return 0;
    int l=1,r=t,mid,i,j,k,ans=0;
    while(l<r){
        mid=r-(r-l)/2;
        if(P[mid].ed<=P[t+1].st){
          l=mid;
        }
        else{
          r=mid-1;
        }
    }
    if(l==r&&P[l].ed<=P[t+1].st) return dp[l];
    return 0;

}
int main()
{
    int N,i,j,k;
    node a,b;
    while(cin>>N){
        for(i=1;i<=N;++i){
            scanf("%d%d%d",&P[i].st,&P[i].ed,&P[i].val);
        }
        sort(P+1,P+N+1);
    for(i=1;i<=N;++i){
        dp[i]=max(solve(i-1)+P[i].val,dp[i-1]);
    }
    printf("%d\n",dp[N]);
    }
    return 0;
}

NYOJ 720 DP+二分的更多相关文章

  1. HDU 3433 (DP + 二分) A Task Process

    题意: 有n个员工,每个员工完成一件A任务和一件B任务的时间给出,问要完成x件A任务y件B任务所需的最短时间是多少 思路: DP + 二分我也是第一次见到,这个我只能说太难想了,根本想不到. dp[i ...

  2. 两种解法-树形dp+二分+单调队列(或RMQ)-hdu-4123-Bob’s Race

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4123 题目大意: 给一棵树,n个节点,每条边有个权值,从每个点i出发有个不经过自己走过的点的最远距离 ...

  3. POJ-2533最长上升子序列(DP+二分)(优化版)

    Longest Ordered Subsequence Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 41944   Acc ...

  4. hdu2993之斜率dp+二分查找

    MAX Average Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  5. poj3208 Apocalypse Someday 数位dp+二分 求第K(K <= 5*107)个有连续3个6的数。

    /** 题目:poj3208 Apocalypse Someday 链接:http://poj.org/problem?id=3208 题意:求第K(K <= 5*107)个有连续3个6的数. ...

  6. hdu 1025:Constructing Roads In JGShining's Kingdom(DP + 二分优化)

    Constructing Roads In JGShining's Kingdom Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65 ...

  7. 【bzoj3312】[Usaco2013 Nov]No Change 状态压缩dp+二分

    题目描述 Farmer John is at the market to purchase supplies for his farm. He has in his pocket K coins (1 ...

  8. [Codeforces 865C]Gotta Go Fast(期望dp+二分答案)

    [Codeforces 865C]Gotta Go Fast(期望dp+二分答案) 题面 一个游戏一共有n个关卡,对于第i关,用a[i]时间通过的概率为p[i],用b[i]通过的时间为1-p[i],每 ...

  9. 1. 线性DP 887. 鸡蛋掉落 (DP+二分)

    887. 鸡蛋掉落 (DP+二分) https://leetcode-cn.com/problems/super-egg-drop/ /*首先分析1个蛋,1个蛋的话,最坏情况需要N次,每次只能从0 1 ...

随机推荐

  1. Oracle下Delete语句

    Delete语句 基本语法: delete from 表名 where 条件 注意事项: 1,如果不使用where子句,将表中所有数据全部删除 delete from test; 2,如果要删除某列的 ...

  2. pta 天梯地图 (Dijkstra)

    本题要求你实现一个天梯赛专属在线地图,队员输入自己学校所在地和赛场地点后,该地图应该推荐两条路线:一条是最快到达路线:一条是最短距离的路线.题目保证对任意的查询请求,地图上都至少存在一条可达路线. 输 ...

  3. hdu5542 The Battle of Chibi【树状数组】【离散化】

    The Battle of Chibi Time Limit: 6000/4000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Othe ...

  4. RSA算法原理与加密解密 求私钥等价求求模反元素 等价于分解出2个质数 (r*X+1)%[(p-1)(q-1)]=0

    Rsapaper.pdf http://people.csail.mit.edu/rivest/Rsapaper.pdf [概述Abstract 1.将字符串按照双方约定的规则转化为小于n的正整数m, ...

  5. Python性能鸡汤(转)

    英文原文:http://blog.monitis.com/index.php/2012/02/13/python-performance-tips-part-1/ 英文原文:http://blog.m ...

  6. 如何编写一个python项目

    https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001397616003925a ...

  7. python拼接字符串

    python拼接字符串一般有以下几种方法: 1.直接通过(+)操作符拼接 s = 'Hello' + ' ' + 'World' + '!' print(s) 输出结果:Hello World! 使用 ...

  8. 解读webpack的bundle.js

    可能就是好奇心略重了,读了一下webpack打包后的bundle.js的代码,复杂的模块可能读不懂,但简单的hello world模块我还是能看懂的.没什么目的,就是想通过几个简单的模块,一条简单的w ...

  9. .net webform 把word转为html

    首先添加引用 引用命名空间 using Microsoft.Office.Interop.Word; using System; using System.Collections.Generic; u ...

  10. Mybatis 之动态代理

    使用Mybatis 开发Web 工程时,通过Mapper 动态代理机制,可以只编写接口以及方法的定义. 如下: 定义db.properties driver=oracle.jdbc.OracleDri ...