本文主要是介绍处女座的百日理财计划,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
【题目描述】
处女座为了有更充足的资金和小姐姐一起玩耍,于是就放"高利贷"给小姐姐,一般小姐姐一周就会还钱,而处女座只要10%的利率,这样算下来,如果可以利滚利的话,1元钱经过1年(360天)可以变成51.43元呢,想起来就非常美滋滋哦!
不过总是借钱给小姐姐并不是长远之策,处女座开始了自己的百日理财计划。处女座在第一天的早上可以获得1000元的启动资金。之后在每天的早上,他会回收借给别人的到期的资金;在每天的晚上,他可以把任意整数金额的现金借给别人。对于第i个人,他要借Di天,总利息是Mi%,同时他有Pi%的概率跑路;在每天的中午,他都可以去玩一下老虎机,他可以投入整数的金额,在第i天,他有Qi%的几率让金额翻倍,同时还有1−Qi%的概率输。
现在处女座想知道,按照期望去估算每一次的投入的话,如果他采用最优策略投资,他可以反复将钱借给同一个人(大财主为啥不多奉陪呢),在第100天的晚上,他手上最多会有多少现金。
为了便于计算,处女座手上的现金只能为一个整数,每次投资多出来的小数部分会自动舍去。同时由于结果可能很大,你只需要输出对1,000,000,007取模的结果即可。
【输入描述】
输入数据第一行包含一个整数N,表示愿意找处女座借钱的人数。
接下来N行,每行包括三个整数Di,Mi,Pi,含义如题目描述所示。
最后一行包括100个整数Qi,表示每一天老虎机中奖的概率。
0≤N≤10,000
0≤Pi,Qi≤100
1≤Mi,Di≤100【输出描述】
一行包括一个整数,表示处女座在第100天的晚上手上最多有的钱数对1,000,000,007取模的结果。
【样例】
示例1
输入
1
99 100 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 100
输出
4000
说明
处女座在第一天晚上把1000元借给第1个人,经过99天到了第100天早上收回2000元,并在当天中午玩老虎机使得自己的资金全部翻倍,最终在第100天晚上可以拥有4000元。
思路:
首先需要按照期望来估计收益,根据题意,借钱的收益是 (1+Mi%)*(1-Pi%),老虎机的收益是 2*Qi%
因此,当老虎机的概率 > 50% 一定会去玩,而对于借钱进行 dp 即可,由于收益固定,因此每次都是全部投入的
由于要去 max 且涉及乘法操作,long long 的范围不够,因此需要使用高精来做,最后再进行取模
【源代码】
D=[0]*10001
M=[0]*10001
P=[0]*10001
res=[0]*10001n=int(input())
for i in range(n):D[i],M[i],P[i] = map(int , input().split(" "))
Q=[int(i) for i in input().split(" ")]res[0]=1000
for i in range(100):if i>0:#回收借给别人的资金res[i]=max(res[i-1],res[i])if Q[i]>50:#老虎机res[i]=res[i]*2*Q[i]//100for j in range(n):#考虑借钱if i+D[j]<=100:res[i+D[j]]=max(res[i+D[j]] , res[i]*(100+M[j])*(100-P[j])//10000 )
print(res[99] % 1000000007)
这篇关于处女座的百日理财计划的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!