题目描述:

小明每天都在开源社区上做项目,假设每天他都有很多项目可以选,其中每个项目都有一个开始时间和截止时间,假设做完每个项目后,拿到报酬都是不同的。由于小明马上就要硕士毕业了,面临着买房、买车、给女友买各种包包的鸭梨,但是他的钱包却空空如也,他需要足够的money来充实钱包。万能的网友麻烦你来帮帮小明,如何在最短时间内安排自己手中的项目才能保证赚钱最多(注意:做项目的时候,项目不能并行,即两个项目之间不能有时间重叠,但是一个项目刚结束,就可以立即做另一个项目,即项目起止时间点可以重叠)。

输入:

输入可能包含多个测试样例。
对于每个测试案例,输入的第一行是一个整数n(1<=n<=10000):代表小明手中的项目个数。
接下来共有n行,每行有3个整数st、ed、val,分别表示项目的开始、截至时间和项目的报酬,相邻两数之间用空格隔开。
st、ed、value取值均在32位有符号整数(int)的范围内,输入数据保证所有数据的value总和也在int范围内。

输出:

对应每个测试案例,输出小明可以获得的最大报酬。

样例输入:
3
1 3 6
4 8 9
2 5 16
4
1 14 10
5 20 15
15 20 8
18 22 12
样例输出:
16
22 这个题用动态规划来做,开始采用的dp[],数组下标为时间,但这样做耗时很长,一个示例性的代码如下
 #include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#define MAX 10002
#define inf 99999999
struct Project
{
int start;
int end;
int value;
}; int cmp(const void *a, const void *b) {
Project at = *(Project *)a;
Project bt = *(Project *)b;
return at.end - bt.end;
} Project act[MAX];
int dp[inf]; int main(int argc, char const *argv[])
{
int n;
//freopen("input.txt","r",stdin);
while(scanf("%d",&n) != EOF) {
int endMax = ;
for(int i = ; i < n; i++) {
scanf("%d %d %d",&act[i].start, &act[i].end, &act[i].value);
if(act[i].end > endMax) {
endMax = act[i].end;
}
}
//qsort(act,n,sizeof(Project),cmp); memset(dp, , sizeof(dp));
for(int i = ; i < n; i++) {
for(int j = endMax; j >= act[i].end; j--) {
int temp = dp[act[i].start] + act[i].value;
if(dp[j] < temp) {
dp[j] = temp;
}
}
}
printf("%d\n",dp[endMax]);
}
return ;
}

之后下标的意义改为任务数,代码如下

 #include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <iostream>
#define MAX 10002 using namespace std;
struct Project
{
int start;
int end;
int value;
}; int cmp(const void *a, const void *b) {
Project at = *(Project *)a;
Project bt = *(Project *)b;
return at.end - bt.end;
} Project act[MAX];
int dp[MAX]; int main(int argc, char const *argv[])
{
int n;
//freopen("input.txt","r",stdin);
while(scanf("%d",&n) != EOF) {
int endMax = ;
for(int i = ; i < n; i++) {
scanf("%d %d %d",&act[i].start, &act[i].end, &act[i].value);
if(act[i].end > endMax) {
endMax = act[i].end;
}
}
qsort(act,n,sizeof(Project),cmp); memset(dp, , sizeof(dp));
dp[] = act[].value; for(int i = ; i < n; i++) {
dp[i] = dp[i-];
for(int j = i-; j >= ; j--) {
if(act[j].end <= act[i].start) {
dp[i] = max(dp[i-], dp[j] + act[i].value);
break;
}
}
dp[i] = max(dp[i], act[i].value);
}
printf("%d\n",dp[n-]);
}
return ;
}

一开始代码提交错误,是因为没有43行这句话

最新文章

  1. Python介绍
  2. linux shell trap的使用
  3. c#的逻辑运算符重载(二)
  4. js产生随机数函数
  5. linux命令:more
  6. 【转】mac os x系统上Android开发环境的搭建
  7. Linux下永久修改主机名
  8. C#和VC++字符集和编码
  9. CentOS 下的MySQL配置
  10. android学习笔记22——Notification
  11. 学习记录 java session保存用户登录
  12. Egret 双端接入爱贝支付遇到的问题
  13. python爆破zip脚本
  14. 10、 iOS 加载图片选择imageNamed 方法还是 imageWithContentsOfFile
  15. poj_3461: Oulipo
  16. java 之 桥接模式(大话设计模式)
  17. jQuery基础 (四)——使用jquery-cookie 实现点赞功能
  18. Mego开发文档 - 建模高级主题
  19. [apache2.4]configure: error: APR not found. Please read the documentation.
  20. Java8新特性之三:Stream API

热门文章

  1. Jenkins结合ant传递参数
  2. Python实现扫描作业配置自动化
  3. SQL server 数据库基础语句 查询语句
  4. LINUX 安装JDK (rpm格式和tar.gz格式)
  5. 洛谷 P1926 小书童——刷题大军
  6. ARC和MRC混合模式下的编译问题
  7. eclipse报错MA
  8. 诊断 Grid Infrastructure 启动问题 (文档 ID 1623340.1)
  9. 强化学习_Deep Q Learning(DQN)_代码解析
  10. 后台返回平铺数据,如何转换成树形json并渲染树形结构,ant tree 异步加载