NOIP2023 天天爱打卡 题解

题意描述

小 T 同学非常热衷于跑步。为了让跑步更加有趣,他决定制作一款叫做《天天爱打卡》的软件,使得用户每天都可以进行跑步打卡。

开发完成后,小 T 同学计划进行试运行,他找了大 Y 同学来帮忙。试运行共 nnn 天,编号为从 111nnn

对大 Y 同学来说,如果某天他选择跑步打卡,那么他的能量值会减少 ddd。初始时,他的能量值是 000,并且试运行期间他的能量值可以是负数

而且大 Y 不会连续跑步打卡超过 kkk 天;即不能存在 1≤x≤n−k1\le x\le n-k1xnk,使得他在第 xxx 到第 x+kx+kx+k 天均进行了跑步打卡。

小 T 同学在软件中设计了 mmm 个挑战,第 iii1≤i≤m1\le i \le m1im)个挑战可以用三个正整数 (xi,yi,vi)(x_i,y_i,v_i)(xi,yi,vi) 描述,表示如果在第 xix_ixi 天时,用户已经连续跑步打卡至少 yiy_iyi 天(即第 xi−yi+1x_i-y_i+1xiyi+1 到第 xix_ixi 天均完成了跑步打卡),那么小 T 同学就会请用户吃饭,从而使用户的能量值提高 viv_ivi

现在大 Y 想知道,在软件试运行的 nnn 天结束后,他的能量值最高可以达到多少?

题解

考场上没时间写离散化,100→56100\to5610056,警惕看错时间仙人。

8pts做法

爆搜进行哪个挑战,判断下是否满足要求即可。
时间复杂度 O(2n) O(n2n)O(2^n)~O(n2^n)O(2n) O(n2n),预计得分8pts。

36pts做法

尝试设计一个 DPDPDP
首先先将题意中的挑战定义下形式。
对第 iii 个挑战,(li,ri,vi)(l_i,r_i,v_i)(li,ri,vi) 表示从第 li=xi−yi+1l_i=x_i-y_i+1li=xiyi+1 天开始,到第 ri=xir_i=x_iri=xi 天为止连续跑步,能够得到的能量值为 viv_ivi

fi,0/1f_{i,0/1}fi,0/1 分别表示第 iii强制不选/不强制不选的最大能量。
在附带一个辅助数组 arri,j=∑rk<j,lk=ivkarr_{i,j}=\sum_{r_k<j,l_k=i}v_karri,j=rk<j,lk=ivk(具体实现看代码)。
不难发现有转移式
fi,0=max⁡fi−1,0,fi−1,1f_{i,0} = \max{f_{i-1,0},f_{i-1,1}}fi,0=maxfi1,0,fi1,1
fi,1=max⁡i−j<kfj−1,0+∑k∈[j,i]arrk−(i−j+1)f_{i,1} = \max_{i-j<k}{f_{j -1,0}+\sum_{k\in[j,i]}{arr_k} - (i-j+1)}fi,1=ij<kmaxfj1,0+k[j,i]arrk(ij+1)
当然,根据定义fi,1←max⁡fi,1,fi,0f_{i,1}\gets \max{f_{i,1},f_{i,0}}fi,1maxf

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值