九度oj 题目1499:项目安排
- 题目描述:
-
小明每天都在开源社区上做项目,假设每天他都有很多项目可以选,其中每个项目都有一个开始时间和截止时间,假设做完每个项目后,拿到报酬都是不同的。由于小明马上就要硕士毕业了,面临着买房、买车、给女友买各种包包的鸭梨,但是他的钱包却空空如也,他需要足够的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行这句话
九度oj 题目1499:项目安排的更多相关文章
- 九度OJ 题目1384:二维数组中的查找
/********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...
- hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人
钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- 九度oj题目&吉大考研11年机试题全解
九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码). http://ac.jobdu.com/problem.php?pid=11 ...
- 九度oj 题目1007:奥运排序问题
九度oj 题目1007:奥运排序问题 恢复 题目描述: 按要求,给国家进行排名. 输入: 有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号 ...
- 九度oj 题目1087:约数的个数
题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...
- 九度OJ题目1105:字符串的反码
tips:scanf,cin输入字符串遇到空格就停止,所以想输入一行字符并保留最后的"\0"还是用gets()函数比较好,九度OJ真操蛋,true?没有这个关键字,还是用1吧,还是 ...
- 九度oj题目1009:二叉搜索树
题目描述: 判断两序列是否为同一二叉搜索树序列 输入: 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接 ...
- 九度oj题目1002:Grading
//不是说C语言就是C++的子集么,为毛printf在九度OJ上不能通过编译,abs还不支持参数为整型的abs()重载 //C++比较正确的做法是#include<cmath.h>,cou ...
- 九度OJ题目1003:A+B
while(cin>>str1>>str2)就行了,多简单,不得不吐槽,九度的OJ真奇葩 题目描述: 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号", ...
随机推荐
- Objective-C Loops
There may be a situation, when you need to execute a block of code several number of times. In gener ...
- Ubuntu下软件的搜索与安装
本文为笔者原创,首发于简书(点击这里查看). 小白玩转linux的第一个拦路虎就是软件的安装了.本文结合自己在Ubuntu14.04下软件安装经验做一个总结. 1.如何搜索软件? apt-cache ...
- How to install Eclipse?
http://askubuntu.com/questions/26632/how-to-install-eclipse How to install Eclipse? up vote113down v ...
- POJ 1741 Tree (树的分治,树的重心)
题意:给一棵树,n个节点,给定一个数k,求任意满足dist(a,b)<=k的点对的数量. 思路: 这道题的思路比较简单,但是细节很多. 此题可以用分治法,如何分治? (1)如果path(a,b) ...
- 你是猴子请来的逗比么!IT跳槽大事件
3月招聘大战早已硝烟四起,互联网职场摇身一变成了跳蚤市场,猎头们告诉跳蚤们,跳不跳不是不问题,往哪儿跳才是重点,跳对了高薪期权都如过眼云烟.不过小编不得不说,劳资最痛恨那些跳槽的人啦!就因为加班 ...
- SQLite连接
SQLite -连接 SQLite的联接子句用于从数据库中的两个或多个表合并的记录.JOIN是用于通过使用共同的每个值从两个表结合域的装置. SQL定义了三个主要类型的连接: CROSS JOIN I ...
- WPF中窗体调用窗体
在WPF中有时候我们需要在一个窗体中去调用另外的一个窗体,下面给出调用方法. 下面实现在MainWindow中通过点击一个按钮调用另外的一个窗口. 首先创建你要调用的另外一个窗口:点击最上面的项目 ...
- MFC:AfxLoadLibrary-将指定的 DLL 映射到调用进程的地址空间
Visual Studio 2012 - Visual C++ LoadLibrary 和 AfxLoadLibrary 进程调用 LoadLibrary (或 AfxLoadLibrary) 以显式 ...
- shell脚本,100以内的质数有哪些?
[root@localhost wyb]# cat 9zhishu.sh #!/bin/bash ` do ;j<=i-;j++)) do [ $((i%j)) -eq ] && ...
- angular-file-upload 在IE下使用的坑
如果在控件配置里面设置了queueLimit属性为1,就是队列文件个数为1,并且在<input>标签设置里multiple属性. 在IE浏览器上传附件的时候,浏览器会报错“SCRIPT50 ...