2014百度之星初赛第二轮解题报告:best_financing
来源:互联网 发布:mac 删除软件 编辑:程序博客网 时间:2024/05/02 05:04
BestFinancing
时间限制:1s 内存限制:65536K
问题描述
小A想通过合理投资银行理财产品达到收益最大化。已知小A在未来一段时间中的收入情况,描述为两个长度为n的整数数组dates和earnings,表示在第dates天小A收入earnings元(0<=i<n)。银行推出的理财产品均为周期和收益确定的,可描述为长度为m的三个整数数组start、finish和interest_rates, 若购买理财产品i(0<=i<m),需要在第start天投入本金,在第finish天可取回本金和收益,在这期间本金和收益都无法取回,收益为本金*interest_rates/100.0。当天取得的收入或理财产品到期取回的本金当天即可购买理财产品(注意:不考虑复利,即购买理财产品获得的收益不能用于购买后续的理财产品)。假定闲置的钱没有其他收益,如活期收益等,所有收益只能通过购买这些理财产品获得。求小A可以获得的最大收益。
限制条件:
1<=n<=2500
1<=m<=2500
对于任意i(0<=i<n),1<=dates<=100000,1<=earnings<=100000, dates中无重复元素。
对于任意i(0<=i<m),1<=start<finish<=100000,1<=interest_rates<=100。
限制条件:
1<=n<=2500
1<=m<=2500
对于任意i(0<=i<n),1<=dates<=100000,1<=earnings<=100000, dates中无重复元素。
对于任意i(0<=i<m),1<=start<finish<=100000,1<=interest_rates<=100。
限制条件
1<=n<=2500
1<=m<=2500
对于任意i(0<=i<n),1<=dates<=100000,1<=earnings<=100000, dates中无重复元素。
对于任意i(0<=i<m),1<=start<finish<=100000, 1<=interest_rates<=100。
输入
第一行为T (T<=200),表示输入数据组数。
每组数据格式如下:
第一行是n m
之后连续n行,每行为两个以空格分隔的整数,依次为date和earning
之后连续m行,每行为三个以空格分隔的整数,依次为start,finish和interest_rate
每组数据格式如下:
第一行是n m
之后连续n行,每行为两个以空格分隔的整数,依次为date和earning
之后连续m行,每行为三个以空格分隔的整数,依次为start,finish和interest_rate
输出
对第i组数据,i从1开始计,输出
Case #i:
收益数值,保留小数点后两位,四舍五入。
样例输入
2
1 2
1 10000
1 100 5
50 200 10
2 2
1 10000
5 20000
1 5 6
5 9 7
样例输出
Case #1:
1000.00
Case #2:
2700.00
解题报告 – BestFinancing
考虑所有理财产品在时间轴上已经确定分布,那么对于一个给定的时间点的单位投入,最优的收益率是一定的。另外,显然的,所有日期可以离散化成一个升序的序列。于是问题可以分解为对每个离散化后的日期,求得此时单位投入的最大收益率,然后若此日期有收入,将收入与收益率的乘积累加,即是最终的结果。
于是题目变成简单的一维的动态规划。对于某个理财产品,记为profit(startdate, enddate),
给定日期date的最大收益记为a[date],则
a[date] = max {
a[date+1],
profit(date,enddate)+a[enddate] for any profit(startdate, enddate) startdate=date
}
程序实现从后向前递推即可。由于不计算复利,所有操作可以简化为收益率的整数累加操作,在最后结果统一除以100,保留小数点后两位即可。
动态规划的时间复杂度是O(N),排序的时间复杂度是O(NlogN)。
对于题目给出的数据范围,O(N*N)的复杂度也可以通过。
#include <cstdio>#include <iostream>const int MAX_N = 2500;const int MAX_M = 2500;int n;int m;int dates[MAX_N];int earnings[MAX_N];int start[MAX_M];int finish[MAX_M];int interest_rates[MAX_M];int best[MAX_M];long long max_profit(){ for (int i = 0; i < m; ++i) { for (int j = i; j > 0 && start[j] < start[j - 1]; --j) { std::swap(start[j], start[j - 1]); std::swap(finish[j], finish[j - 1]); std::swap(interest_rates[j], interest_rates[j - 1]); } } for (int i = m - 1; i >= 0; --i) { int b = 0; for (int j = i + 1; j < m; ++j) { if (finish <= start[j]) { b = std::max(b, best[j]); } } best = interest_rates + b; } long long res = 0; for (int i = 0; i < n; ++i) { int b = 0; for (int j = 0; j < m; ++j) { if (dates <= start[j]) { b = std::max(b, best[j]); } } res += (long long) b * earnings; } return res;}int main(){ int T; std::cin >> T; for (int case_num = 1; case_num <= T; ++case_num) { std::cin >> n >> m; for (int i = 0; i < n; ++i) { std::cin >> dates >> earnings; } for (int i = 0; i < m; ++i) { std::cin >> start >> finish >> interest_rates; } long long res = max_profit(); fprintf(stdout, "Case #%d:\n%.2f\n", case_num, res / 100.0); } return 0;}
0 0
- 2014百度之星初赛第二轮解题报告:best_financing
- 2014百度之星初赛第二轮代码注释:Best_Financing
- 2014百度之星初赛第二轮解题报告:chess
- 【百度之星2014~初赛(第二轮)解题报告】Chess
- 【百度之星2014~初赛(第二轮)解题报告】JZP Set
- 2014百度之星初赛第二轮解题报告:Scenic Popularity
- 2014百度之星初赛第二轮解题报告:JZP set
- 【百度之星2014~初赛解题报告】
- 2014百度之星初赛第一轮解题报告:grids
- 2014百度之星初赛第一轮解题报告:CycleCocycle
- 2014百度之星初赛第一轮解题报告:information
- 2014百度之星初赛第一轮解题报告:party
- HDU4834 JZP Set 2014年百度之星程序设计大赛 - 初赛(第二轮) 数学
- 2014百度之星初赛第二轮代码注释:Scenic Popularity
- 百度之星初赛第二轮第一题超时代码(可能还有错误)
- HDU4828 Grids 百度之星初赛1002解题报告
- 2015 百度之星初赛1 解题报告
- 2016"百度之星" - 初赛(Astar Round2A)解题报告
- C笔记--接口封装思想引导以及初步实践
- 职责链
- Win8.1 vmware station 10 无法联网
- Java异常处理
- cookie 和session 的区别详解
- 2014百度之星初赛第二轮解题报告:best_financing
- 【8】自己写数据库函数库 — 编译函数库
- 【求职受骗】我在黄河旋风150天,别让无良企业再坑学弟学妹们
- 2014百度之星初赛第二轮解题报告:chess
- mysql优化:连接数
- 苹果Swift语言入门教程【中文版】
- uva 10051 Tower of Cubes
- 高斯白噪声的统计特性
- 新手上路