zoukankan      html  css  js  c++  java
  • 九度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[],数组下标为时间,但这样做耗时很长,一个示例性的代码如下
     1 #include <cstdio>
     2 #include <cstdlib>
     3 #include <cstring>
     4 #include <algorithm>
     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
    ",dp[endMax]);
    47     }
    48     return 0;
    49 }

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

     1 #include <cstdio>
     2 #include <cstdlib>
     3 #include <cstring>
     4 #include <algorithm>
     5 #include <iostream>
     6 #define MAX 10002
     7 
     8 using namespace std;
     9 struct Project
    10 {
    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
    ",dp[n-1]);
    53     }
    54     return 0;
    55 }

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

  • 相关阅读:
    记录两种获取配置文件的方法
    jsp-自定义标签
    转载 -jsp静态包含和动态包含的区别
    Linux基础知识笔记
    关于HTTP协议
    关于orcale创建type的一些小经验(遇到的坑)
    servlet处理乱码之post和get
    发布restful类型的接口
    ros2 dashing 安装失败指南
    exit回调
  • 原文地址:https://www.cnblogs.com/jasonJie/p/5766892.html
Copyright © 2011-2022 走看看