博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
九度oj 题目1499:项目安排
阅读量:5303 次
发布时间:2019-06-14

本文共 3387 字,大约阅读时间需要 11 分钟。

题目描述:

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

 

输入:

输入可能包含多个测试样例。

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

 

输出:

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

 

样例输入:
31 3 64 8 92 5 1641 14 105 20 1515 20 818 22 12
样例输出:
1622 这个题用动态规划来做,开始采用的dp[],数组下标为时间,但这样做耗时很长,一个示例性的代码如下
1 #include 
2 #include
3 #include
4 #include
5 #define MAX 10002 6 #define inf 99999999 7 struct Project 8 { 9 int start;10 int end;11 int value;12 };13 14 int cmp(const void *a, const void *b) {15 Project at = *(Project *)a;16 Project bt = *(Project *)b;17 return at.end - bt.end;18 }19 20 Project act[MAX];21 int dp[inf];22 23 int main(int argc, char const *argv[])24 {25 int n;26 //freopen("input.txt","r",stdin);27 while(scanf("%d",&n) != EOF) {28 int endMax = 0;29 for(int i = 0; i < n; i++) {30 scanf("%d %d %d",&act[i].start, &act[i].end, &act[i].value);31 if(act[i].end > endMax) {32 endMax = act[i].end;33 }34 }35 //qsort(act,n,sizeof(Project),cmp);36 37 memset(dp, 0, sizeof(dp));38 for(int i = 0; i < n; i++) {39 for(int j = endMax; j >= act[i].end; j--) {40 int temp = dp[act[i].start] + act[i].value;41 if(dp[j] < temp) {42 dp[j] = temp;43 }44 }45 }46 printf("%d\n",dp[endMax]);47 }48 return 0;49 }

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

1 #include 
2 #include
3 #include
4 #include
5 #include
6 #define MAX 10002 7 8 using namespace std; 9 struct Project10 {11 int start;12 int end;13 int value;14 };15 16 int cmp(const void *a, const void *b) {17 Project at = *(Project *)a;18 Project bt = *(Project *)b;19 return at.end - bt.end;20 }21 22 Project act[MAX];23 int dp[MAX];24 25 int main(int argc, char const *argv[])26 {27 int n;28 //freopen("input.txt","r",stdin);29 while(scanf("%d",&n) != EOF) {30 int endMax = 0;31 for(int i = 0; i < n; i++) {32 scanf("%d %d %d",&act[i].start, &act[i].end, &act[i].value);33 if(act[i].end > endMax) {34 endMax = act[i].end;35 }36 }37 qsort(act,n,sizeof(Project),cmp);38 39 memset(dp, 0, sizeof(dp));40 dp[0] = act[0].value;41 42 for(int i = 1; i < n; i++) {43 dp[i] = dp[i-1];44 for(int j = i-1; j >= 0; j--) {45 if(act[j].end <= act[i].start) {46 dp[i] = max(dp[i-1], dp[j] + act[i].value);47 break;48 }49 }50 dp[i] = max(dp[i], act[i].value);51 }52 printf("%d\n",dp[n-1]);53 }54 return 0;55 }

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

转载于:https://www.cnblogs.com/jasonJie/p/5766892.html

你可能感兴趣的文章
JavaScript基础---获取元素的属性(title,style,width)
查看>>
简单了解HashCode()
查看>>
闭包理解
查看>>
asp.net C#后台实现下载文件的几种方法(全)
查看>>
Web前端开发工程师的具备条件
查看>>
实用Android开发工具和资源精选
查看>>
TileMap
查看>>
JS属性大全
查看>>
java复制文件
查看>>
第一册:lesson seventy nine.
查看>>
GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例
查看>>
团队作业
查看>>
数据持久化时的小bug
查看>>
mysql中key 、primary key 、unique key 与index区别
查看>>
bzoj2257
查看>>
Linux查看文件编码格式及文件编码转换<转>
查看>>
Leetcode: Find Leaves of Binary Tree
查看>>
Vue 模板解释
查看>>
http://www.bootcss.com/
查看>>
20145308 《网络对抗》 注入shellcode+Return-to-libc攻击 学习总结
查看>>