noip 2015 pj 普及组 第四题 推销员 salesman

这道题的题目大意就是说一个人要到一段死胡同去推销,拜访第i个门户会消耗a[i]体力,走路也会消耗一些体力,第i个门户距离胡同口的距离是s[i],然后让你输出在不多余走路的情况下拜访1户(x==1),拜访2户(x==2)......拜访n(x==n)户分别最多要消耗多少体力。

初看这道题自己感觉没有任何头绪,于是反复读样例,发现这道题有一定的规律,当x==1时,答案就是最大的s[i]*2+a[i],这个值可以在输完s[i]的时候就判断出来。其中s[i]*2的原因是在死胡同里面走的时候,如果你要走到s[i]的深度且不走多余的路,那么从进去到出来你一定会走2*s[i]的路程,对吧?

那么此时我们已经有了x==1的答案,那么可以猜测我们是不是可以通过x==1来推出x==2,x==3乃至x==n的答案来呢?

首先,可以暴力枚举......不过一看数据规模,n<=100000,简直了,还是算了吧......

然后,继续反复读样例说明,每次x的值增加1的时候,一定会多走一个门户(其实这是一句废话),那么根据这条性质,我们需要多走的那个门户一定就是当前的未走的门户中耗费体力值最大的。ans[i]=ans[i-1]+max(门户消耗的体力),一定是这样的吧?那么,我们是不是可以每当x循环增加1以后,都找出当前还没走的门户消耗体力的最大值,也就是找出max(门户消耗的体力)......嗯,一定是这样......

可是每次这样找最大值就成了O(n^2)的复杂度,明显还是爆......那

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值