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])

1186. 删除一次得到子数组最大和;1711. 大餐计数;1834. 单线程 CPU_第1张图片

 注意:dp0和dp1的顺序

1711. 大餐计数

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

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

1186. 删除一次得到子数组最大和;1711. 大餐计数;1834. 单线程 CPU_第2张图片

1834. 单线程 CPU

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

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

1186. 删除一次得到子数组最大和;1711. 大餐计数;1834. 单线程 CPU_第3张图片

 

你可能感兴趣的:(python,算法)