Codeforces Round #713 (Div. 3) F. Education 超详细思考过程

Posted yueshehanjiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #713 (Div. 3) F. Education 超详细思考过程相关的知识,希望对你有一定的参考价值。

F. Education

题意

t组样例(t <= 1e4)

每组样例给你n , c
a[1] , a[2] ........ a[n] 
b[1] , b[2] .........b[n-1]
(n <= 2e5 , c <= 1e9)
c表示目标的金钱

如果你在等级i
你每天可以赚a[i]的钱

当然你在这一天也可以不赚钱
升级你的等级

如果你的等级在i
升级到i+1级需要b[i]的钱

你一开始在第1个等级
问赚到至少c钱的最小天数

数据保证 a递增
a[1] <= a[2] <= a[3] <= ........ <= a[n]

思路

一看感觉是个dp

每天都有2种选择
要么赚钱,要么升级

假设f[i][j]为当前在第i天,等级为j的情况下所赚的最大钱的数量
考虑一下状态转移方程

i这天赚钱
f[i][j] = max( f[i][j],f[i-1][j] + a[j] )

或者在i这天升级
当然前提是f[i][j] >= b[j] 
f[i][j] = max( f[i][j] , f[i-1][j-1] - b[j] )

然后考虑一下时间复杂度
O tn^2
一定超时

这。。。。。

只能换一种思路
那在考虑一下,一共最多n个等级
假设只升到i这个等级
并且在i这个等级赚了c钱
所需要的最小天数
如果可以 o1 算出来的话,我们可以枚举所有等级
更新最小值

那么
设cost[i]数组表示只在等级i赚到c钱的最小天数

所以cost[i] 等于 先升到i这个等级在赚够c的最小天数

cost[1] = ⌈ c a [ 1 ] ⌉ \\lceil \\frac{c}{a[1]} \\rceil a[1]c

cost[2] = ⌈ b [ 1 ] a [ 1 ] ⌉ \\lceil \\frac{b[1]}{a[1]} \\rceil a[1]b[1] + ⌈ c a [ 2 ] ⌉ \\lceil \\frac{c}{a[2]} \\rceil a[2]c + 1

cost[3] = ⌈ b [ 1 ] a [ 1 ] ⌉ \\lceil \\frac{b[1]}{a[1]} \\rceil a[1]b[1] + ⌈ b [ 2 ] a [ 2 ] ⌉ \\lceil \\frac{b[2]}{a[2]} \\rceil a[2]b[2] + ⌈ c a [ 3 ] ⌉ \\lceil \\frac{c}{a[3]} \\rceil a[3]c + 1 + 1

cost[4] = ⌈ b [ 1 ] a [ 1 ] ⌉ \\lceil \\frac{b[1]}{a[1]} \\rceil a[1]b[1] + ⌈ b [ 2 ] a [ 2 ] ⌉ \\lceil \\frac{b[2]}{a[2]} \\rceil a[2]b[2] + ⌈ b [ 3 ] a [ 3 ] ⌉ \\lceil \\frac{b[3]}{a[3]} \\rceil a[3]b[3] + ⌈ c a [ 3 ] ⌉ \\lceil \\frac{c}{a[3]} \\rceil a[3]c + 1 + 1 + 1

cost[n] = ⌈ b [ 1 ] a [ 1 ] ⌉ \\lceil \\frac{b[1]}{a[1]} \\rceil a[1]b[1] + ⌈ b [ 2 ] a [ 2 ] ⌉ \\lceil \\frac{b[2]}{a[2]} \\rceil a[2]b[2] + ⌈ b [ 3 ] a [ 3 ] ⌉ \\lceil \\frac{b[3]}{a[3]} \\rceil a[3]b[3] + … + ⌈ b [ n − 1 ] a [ n − 1 ] ⌉ \\lceil \\frac{b[n-1]}{a[n-1]} \\rceil a[n1]b[n1] + ⌈ c a [ n ] ⌉ \\lceil \\frac{c}{a[n]} \\rceil a[n]c + (n - 1)


对上面这个式子稍微解释一下
因为升级需要单独一天
所以末尾要加上升级的天数


这个式子还没有考虑到一个问题
你升级的时候,假设现在已经赚了7元钱
你升级需要6元钱
那么你升级之后还剩下1元钱

所以你还需要一个h[i] 数组表示
升级到i这个等级所剩下的钱

那么
cost[1] = ⌈ c a [ 1 ] ⌉ \\lceil \\frac{c}{a[1]} \\rceil a[1]c

cost[2] = ⌈ b [ 1 ] a [ 1 ] ⌉ \\lceil \\frac{b[1]}{a[1]} \\rceil a[1]b[1] + ⌈ c − h [ 2 ] a [ 2 ] ⌉ \\lceil \\frac{c-h[2]}{a[2]} \\rceil a[2]ch[2] + 1

cost[3] = ⌈ b [ 1 ] a [ 1 ] ⌉ \\lceil \\frac{b[1]}{a[1]} \\rceil a[1]b[1] + ⌈ b [ 2 ] − h [ 2 ] a [ 2 ] ⌉ \\lceil \\frac{b[2]-h[2]}{a[2]} \\rceil a[2]b[2]h[2] + ⌈ c − h [ 3 ] a [ 3 ] ⌉ \\lceil \\frac{c-h[3]}{a[3]} \\rceil a[3]ch[3] + 1 + 1

cost[4] = ⌈ b [ 1 ] a [ 1 ] ⌉ \\lceil \\frac{b[1]}{a[1]} \\rceil a[1]b[1] + ⌈ b [ 2 ] − h [ 2 ] a [ 2 ] ⌉ \\lceil \\frac{b[2]-h[2]}{a[2]} \\rceil a[2]b[2]h[2] + ⌈ b [ 3 ] − h [ 3 ] a [ 3 ] ⌉ \\lceil \\frac{b[3]-h[3]}{a[3]} \\rceil a[3]b[3]h[3] + ⌈ c − h [ 4 ] a [ 3 ] ⌉ \\lceil \\frac{c-h[4]}{a[3]} \\rceil a[3]ch[4] + 1 + 1 + 1

cost[n] = ⌈ b [ 1 ] a [ 1 ] ⌉ \\lceil \\frac{b[1]}{a[1]} \\rceil a[1]b[1] + ⌈ b [ 2 ] − h [ 2 ] a [ 2 ] ⌉ \\lceil \\frac{b[2]-h[2]}{a[2]} \\rceil a[2]b[2]h[2] + ⌈ b [ 3 ] − h [ 3 ] a [ 3 ] ⌉ \\lceil \\frac{b[3]-h[3]}{a[3]} \\rceil a[3]b[3]h[3] + … + ⌈ b [ n − 1 ] − h [ n − 1 ] a [ n − 1 ] ⌉ \\lceil \\frac{b[n-1]-h[n-1]}{a[n-1]} \\rceil a[n1]b[n1]h[n1] + ⌈ c − h [ n ] a [ n ] ⌉ \\lceil \\frac{c-h[n]}{a[n]} \\rceil a[n]ch[n] + (n - 1)

那么考虑一下怎么用o1的时间求出上面的式子

我们可以发现前面的

⌈ b [ 1 ] a [ 1 ] ⌉ \\lceil \\frac{b[1]}{a[1]} \\rceil a[1]b[1]以上是关于Codeforces Round #713 (Div. 3) F. Education 超详细思考过程的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #436 E. Fire(背包dp+输出路径)

[ACM]Codeforces Round #534 (Div. 2)

Codeforces 713A. Sonya and Queries

Codeforces713C Sonya and Problem Wihtout a Legend(DP)

Codeforces Round #726 (Div. 2) B. Bad Boy(贪心)

(字典树)codeforces - 713A Sonya and Queries