Best Financing

Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 120    Accepted Submission(s): 24

Problem Description
小A想通过合理投资银行理财产品达到收益最大化。已知小A在未来一段时间中的收入情况,描述为两个长度为n的整数数组dates和earnings,表示在第dates[i]天小A收入earnings[i]元(0<=i<n)。银行推出的理财产品均为周期和收益确定的,可描述为长度为m的三个整数数组start、finish和interest_rates, 若购买理财产品i(0<=i<m),需要在第start[i]天投入本金,在第finish[i]天可取回本金和收益,在这期间本金和收益都无法取回,收益为本金*interest_rates[i]/100.0。当天取得的收入或理财产品到期取回的本金当天即可购买理财产品(注意:不考虑复利,即购买理财产品获得的收益不能用于购买后续的理财产品)。假定闲置的钱没有其他收益,如活期收益等,所有收益只能通过购买这些理财产品获得。求小A可以获得的最大收益。
限制条件:
1<=n<=2500
1<=m<=2500
对于任意i(0<=i<n),1<=dates[i]<=100000,1<=earnings[i]<=100000, dates中无重复元素。
对于任意i(0<=i<m),1<=start[i]<finish[i]<=100000, 1<=interest_rates[i]<=100。
 
 
Input
第一行为T (T<=200),表示输入数据组数。
每组数据格式如下:
第一行是n m
之后连续n行,每行为两个以空格分隔的整数,依次为date和earning
之后连续m行,每行为三个以空格分隔的整数,依次为start, finish和interest_rate
 
 
Output
对第i组数据,i从1开始计,输出
Case #i:
收益数值,保留小数点后两位,四舍五入。
 
 
Sample Input
21 21 100001 100 550 200 102 21 100005 200001 5 65 9 7
 
 
Sample Output
Case #1:1000.00Case #2:2700.00
 
 
Source
2014年百度之星程序设计大赛 - 初赛(第二轮)
 
 
 
题目分析:
  
这里我们忽略利率底下的100,将其放在最后计算(因为所有的利益都要除以100,索性放到最后)。
  
这样,题目可以理解为, 给你n份钱,每份钱有一个价值val[i],每份钱所给的时间之后有x个区间,每个区间有一个价值w[i],选择互不相交的区间,这份钱能带来收益即为   val[i] *   sum(w[j])(其中所有的j互不相交)。  
  
所有钱带来的收益即为:sum(val[i] * sum(w[j]))(其中所有的j互不相交)。
 
那么怎么样才能使得收益达到最大??
 
设dp[i]为从第i个时间点开始往后选择的所有不想交的区间的价值总和的最大值,我们假设第i个时间点之后的dp[j]已经得到,那么dp[i] = max(dp[j])+ w[i];
 
则最大利益即 ans = sum(val[i] * dp[i]) / 100.0;(不要忘了将利率底下的100除掉)
 
这里我们用链式前向星存储属于以每个时间点为起点的每个区间的终点和价值。

代码如下:

#include <stdio.h>
#include <string.h>
#include <algorithm>
#define max(a, b) ((a) > (b) ? (a) : (b))
using namespace std;
const int O = 100005;
typedef struct E{int v, n, e;
}E;
E edge[O];
int Adj[O], l;
int val[O], dp[O];
int t, n, m, cas;
int d, e, s, f;
void addedge(int u, int v, int e){edge[l].v = v; edge[l].e = e; edge[l].n = Adj[u]; Adj[u] = l++;
}
int read(){char ch = ' ';int x = 0;while(ch < '0' || ch > '9') ch = getchar();while(ch >= '0' && ch <= '9'){x = x * 10 + ch - '0';ch = getchar();}return x;
}
void work(){memset(val, 0, sizeof(val));memset(Adj, -1, sizeof(Adj));l = 0;n = read(); m = read();while(n--){d = read(); e = read();val[d] += e;}while(m--){s = read(); f = read(); e = read();addedge(s, f, e);}dp[100001] = 0;double ans = 0;for(int i = 100000; i; --i){dp[i] = dp[i + 1];for(int j = Adj[i]; ~j; j = edge[j].n){dp[i] = max(dp[i], dp[edge[j].v] + edge[j].e);}ans += dp[i] * val[i];}printf("%.2f\n", ans / 100);
}
int main(){for(t = read(), cas = 1; cas <= t; ++cas){printf("Case #%d:\n", cas);work();}return 0;
}

【HDU】 4833 Best Financing DP相关推荐

  1. 【HDU】3271 SNIBB 数位DP

    传送门:[HDU]3271 SNIBB 题目分析:第一问直接求,第二问就二分.水题. 代码如下: #include <cmath> #include <cstdio> #inc ...

  2. 【HDU】5370 Tree Maker 【树dp】

    传送门:[HDU]5370 Tree Maker my  code:my~~code: #include <bits/stdc++.h> using namespace std ;type ...

  3. 【HDU】5304 Eastest Magical Day Seep Group's Summer【环dp+生成树计数】

    传送门:[HDU]5304 Eastest Magical Day Seep Group's Summer my  code: my~~code: #include <bits/stdc++.h ...

  4. 【HDU】5197 DZY Loves Orzing 【FFT启发式合并】

    传送门:[HDU]5197 DZY Loves Orzing 题目分析: 首先申明,我不会dpdp方程= =--这个东西给队友找出来了,然后我就是套这个方程做题的Qrz-- 对于这题,因为n2n^2个 ...

  5. 【HDU】3441 Rotation

    题意:给出A和C(1<=A,C<=10^9),所有满足B * B * K + 1 = A * A, (K >= 0)的B,构成边长为B的正方形,等角度的围绕在一个小正方形的周围.用C ...

  6. 【HDU】1695 GCD

    题意:x在[a,b]内,y在[c,d]内,求GCD(x,y)=k的个数,题目保证a=c=1. 由于GCD(x,y)=k,则GCD(x/k,y/k)=1. 那么只要求x在[1,b/k]内,y在[1,d/ ...

  7. 【题解】284E. Coin Troubles(dp+图论建模)

    [题解]284E. Coin Troubles(dp+图论建模) 题意就是要你跑一个完全背包,但是要求背包的方案中有个数相对大小的限制 考虑一个\(c_i<c_j\)的限制,就是一个\(c_i\ ...

  8. 【HDU】4942 Game on S♂play 线段树

    传送门:[HDU]4942 Game on S♂play 题目分析:今天下午被这道题整死了,因为我的写法导致有的数可能变成负的,但是我们有察觉到,debug了一下午还是在吃饭的时候突然想到这个问题的. ...

  9. 【HDU】5238 Calculator 【中国剩余定理+线段树】

    传送门:[HDU]5238 Calculator 题目分析: 模数可以拆成四个小素数:7,13,17,19. 这样我们可以分别对这几个素数跑答案,最后中国剩余定理搞一下就好.中间我们用线段树,保存每个 ...

最新文章

  1. WORD 同一位置引用多篇文献
  2. Linux C编程之四 动态库(共享库)的制作
  3. ERROR Cannot determine the location of the VS Common Tools Folder
  4. mysql binlo 抽取_使用mysqlbinlog根据时间点提取SQL简单方法
  5. 19.C++-(=)赋值操作符、初步编写智能指针
  6. RMAN备份与恢复(三)--备份相关概念
  7. c++学习笔记(15) 异常处理
  8. mysql中datetime有带时区_如何在MySQL中存储datetime与时区信息
  9. HWSD土壤数据集下载及打开方法
  10. 微信小程序如何使用视频组件
  11. java多线程编程--模拟龟兔赛跑过程
  12. MapABC 地图定位
  13. 明清徽州宗族的异姓承继
  14. 阻止软件连接网络(Win)
  15. Python初学者必刷的五个项目,你做过几个?
  16. Foobar2000使用学习
  17. VS2015基于对话框的MFC倒计时器
  18. iOS 导入自定义字体不生效
  19. Shell脚本模拟用户行为刷App积分,学习娱乐之用,再加图像数字识别验证码登录
  20. 嵌入式 linux下proc目录下的文件详解

热门文章

  1. 强制删除五笔字型输入法
  2. 以软件测试的角度测试一支笔,软件测试面试:如何测试一支笔(铅笔,钢笔,中性笔)...
  3. GitHub Copilot 已上线,AI 编程这等来啦!
  4. 开发人工智能使用哪种编程语言好
  5. 雷达图-高效数据解读
  6. 思岚科技邀你2017日本东京国际机器人展
  7. 双指数边缘平滑滤波器用于磨皮算法的尝试
  8. 少年碎碎念:《追飞机的人》
  9. zzulioj1017C语言答案,郑州轻工业大学oj题解(c语言)1017,1018 if典型题
  10. cacti流量监控--verygood