2014百度之星预赛(第二场)——Best Financing

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
2
1 2
1 10000
1 100 5
50 200 10
2 2
1 10000
5 20000
1 5 6
5 9 7
 
Sample Output
Case #1:
1000.00
Case #2:
2700.00
 
Source
 

正确的题意是:

告诉你n个时间点,这些时间点你会得到若干的钱.

然后告诉你m个时间段,以及时间段相应的利率(百分比).

问最后最多能够得到多少钱.

注意事项

首先收益不能用于购买

当天得到钱后当前能够花出去,也就是当天finish的当天可用于购买.

分析

理解题意后,心中会想到这是道DP题.

然后看看每一个时间点得到的钱,貌似他们之间是相互独立的.

实际上看到这个是独立的后。就非常好做了.

对于某个时间点的钱,我们随着时间的向后流动,会遇到一些时间段.

对于遇到的时间段。我们有两个选择:1.买; 2.不买.

买了我们的时间就移动到这个时间段的结束时间,不买了我们的时间移动到下一刻.

最后得到的钱是: 当前钱 * 选择的时间段的利率的和.

建议自己画一个图看看。或者自己心里面想想.

因为我们的目标是是收益最大,也就是是选择的时间段的利率和最大.

这个问题能够轻松的写出状态转移方程:

dp[ i ] = max( dp[i],  dp[j] + rate[i, j]);

当中 dp[ i ] 代表 i 时间点到终于时间的路线上最大的利率和, dp[i] 的初始值能够是 dp[i + 1], 即不选择以这个时间点開始的时间段.

rate[i, j] 代表有个从 i 到 j 的时间段,且这个时间段的利率是 rate[i, j].

这样我们从后向前扫描一遍就能够预处理全部时间点到终于时间的最大利率.

然后我们用当前时间的钱 乘以 当前时间的最优利率和就是当前的最大利益.

AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAX 100005 using namespace std; typedef struct Money
{
int dates;
int earnings;
}Money; typedef struct Earn
{
int start;
int finish;
int rate;
}Earn; bool cmp(const Earn &l,const Earn &r)
{
return l.start<r.start;
} int dp[MAX];
Money money[MAX];
Earn earn[MAX];
int n,m,maxtime;
long long ans; void DP()
{
memset(dp,0,sizeof(dp));
m--;
for(int i=maxtime;i>=0;i--)
{
dp[i]=dp[i+1];
while(m>=0&&i==earn[m].start)
{
dp[i]=max(dp[i],dp[earn[m].finish]+earn[m].rate);
m--;
}
}
} int main(int argc,char *argv[])
{
int t;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
scanf("%d%d",&n,&m);
maxtime=0;
for(int j=0;j<n;j++)
{
scanf("%d%d",&money[j].dates,&money[j].earnings);
maxtime=max(maxtime,money[j].dates);
}
for(int k=0;k<m;k++)
{
scanf("%d%d%d",&earn[k].start,&earn[k].finish,&earn[k].rate);
maxtime=max(maxtime,earn[k].finish);
}
sort(earn,earn+m,cmp);
DP();
ans=0;
for(int j=0;j<n;j++)
ans+=money[j].earnings*dp[money[j].dates];
printf("Case #%d:\n",i);
printf("%I64d.%02I64d\n",ans/100,ans%100);
}
return 0;
}

2014百度之星预赛(第二场)——Best Financing的更多相关文章

  1. 2014百度之星初赛第二场hdu 4831 Scenic Popularity

    Scenic Popularity Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  2. HDU4828 Grids 2014百度之星预赛问题解决

    看看Catalan数的公式:为 Catalan(n) = C(2n, n) / n+1 = C(2n, n) - C(2n, n-1); (公式0) 然后利用全排序表达:Catalan(n) = (2 ...

  3. 2014百度之星资格赛——Disk Schedule

    2014百度拥有明星格比赛--Disk Schedule Problem Description 有非常多从磁盘读取数据的需求,包含顺序读取.随机读取. 为了提高效率.须要人为安排磁盘读取. 然而.在 ...

  4. 2014 百度之星 题解 1004 Labyrinth

    Problem Description 度度熊是一仅仅喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫仅仅能从矩阵左上角第一个方格開始走,仅仅有走到右上角的第一个格子才算走出迷宫,每一次仅仅能 ...

  5. 2014 CodingTrip - 携程编程大赛 (预赛第二场)

    1001: 食物链(poj1182),直接贴代码,稍作可过 并查集 // // main.cpp // 携程1 // // Created by zhang on 14-4-11. // Copyri ...

  6. 2014年百度之星资格赛第二题Disk Schedule

    Problem Description 有非常多从磁盘读取数据的需求,包含顺序读取.随机读取.为了提高效率,须要人为安排磁盘读取. 然而,在现实中,这样的做法非常复杂. 我们考虑一个相对简单的场景. ...

  7. 2014百度之星第二题Disk Schedule(双调欧几里得旅行商问题+DP)

    Disk Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  8. sql注入用<>绕过被过滤的select ——百度杯9月第二场SQL

    题目提示SQL注入,打开源代码发现<!--SELECT * FROM info WHERE id=1--> 尝试union select 1,2,3提示inj code! 经过多次尝试之后 ...

  9. 2014百度之星资格赛—— Xor Sum(01字典树)

    Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Total ...

随机推荐

  1. hdu 4404 Worms(多边形与圆的交)

    求出爆炸点的坐标,就成了多边形与圆相交面积的模板题了... #include<algorithm> #include<iostream> #include<cstring ...

  2. 组队赛第二场:字符串哈希+DP

    长春现场赛 HDU 4821  思路:这题周赛的时候没做出来,有点可惜了.要是当时记起来unsigned long long自己主动取模,然后提醒一下大帝的话,后续大帝就能过了. 唉,导致让他取了好多 ...

  3. 【Java 它 JVM】对象的创建过程

    虚拟机会new 指令: 1.检查指令的参数可在对类的符号引用的恒定饮食定位,并检查是否已装上代表这个类的符号引用.分析和初始化.假设没有.您必须运行相应的类加载过程. 2.类加载通过审查,虚拟机将分配 ...

  4. Windows编程之非模态对话框

    1  创建非模态对话框 <1>  HWNDCreateDialog(  HINSTANCE hInstance,  // handle to module LPCTSTRlpTemplat ...

  5. Phaser是一款专门用于桌面及移动HTML5 2D游戏开发的开源免费框架

    Phaser是一款专门用于桌面及移动HTML5 2D游戏开发的开源免费框架,提供JavaScript和TypeScript双重支持,内置游戏对象的物理属性,采用Pixi.js引擎以加快Canvas和W ...

  6. 读书笔记:《重来REWORK》

    读书笔记:<重来REWORK> <重来Rework--更为简单有效的商业思维>这本书是看了别人的书单而购买的,初 拿到这本书翻看时,感觉有两点与平常的书不同,一是每个小节非常短 ...

  7. shell 脚本之if、for、while语句

    (1)if语句 root@ubuntu:/mnt/shared/shellbox/shellif# cat shellif.sh #!/bin/bash #推断字符串 if [ "$1&qu ...

  8. 用Tomcat和Eclipse开发Servlet程序

    1. 安装eclipse 1). 在官网上直接下载Eclipse IDE for Java EE Developers,解压即可: 2. eclipse安装tomcat插件: 1). 在http:// ...

  9. Nagios+pnp4nagios+rrdtool 安装配置为nagios添加自定义插件(三)

    nagios博大精深,可以以shell.perl等语句为nagios写插件,来满足自己监控的需要.本文写mysql中tps.qps的插件,并把收集到的结果以图形形式展现出来,这样输出的结果就有一定的要 ...

  10. Android编程获取网络连接状态及调用网络配置界面

    获取网络连接状态 随着3G和Wifi的推广,越来越多的Android应用程序需要调用网络资源,检测网络连接状态也就成为网络应用程序所必备的功能. Android平台提供了ConnectivityMan ...