1186. 删除一次得到子数组最大和;1711. 大餐计数;1834. 单线程 CPU

1186. 删除一次得到子数组最大和

解题思路:如果没做过还不是很好想,当时自己第一反应是双指针,结果是个动态规划的题。

核心就是dp的定义,dp[i][k]表示以arr[i]结尾删除k次的最大和。看到这里其实就有一点思路了

dp[i][0]表示以arr[i]结尾删除0次的最大和;

dp[i][1]表示以arr[i]结尾删除1次的最大和,我们只需要统计max(dp[i][0],dp[i][1])即可。

dp[i][0] = dp[i-1][0]+arr[i](保留arr[i]之前的),arr[i](不保留arr[i]之前的)(有点不好理解,可以理解为如果前面结果为负数,直接从arr[i]开始重新计数)

dp[i][1] = dp[i-1][0](删arr[i]),dp[i-1][1]+arr[i](不删arr[i])

 注意:dp0和dp1的顺序

1711. 大餐计数

解题思路:当时看到10的9次方,以为是动态规划的题目。

核心:就是枚举每一个数,然后统计它的左边出现过的可以和它形成2次幂的数出现的个数(这里是通过枚举2,4,8....来统计出现过的数,即是value不断左移就相当于value在不断乘以2,它的上限是最大值的两倍),然后把它放入cnt。

1834. 单线程 CPU

解题思路:其实读完题目后,发现人脑可以很清楚的模拟cpu的行为,即把需要执行的任务放入cpu中,然后cpu选择执行时间短的任务去做,但是当你想用代码实现的时候发现处理起来还是有点难度。

核心:1.时间戳,有了这个你就可以知道,当任务的开始小于时间戳的时候,你需要把任务放入cpu中;2.指针,这个是为了让我们执行到每一个任务;3.将任务按照开始时间排序并和它的下标对应,因为输出结果需要输出下标。4.最小堆,我们需要一个最小堆来存储我们放入的任务,然后执行完一个后,弹出执行时间最少的那个。

 

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值