题目:瞌睡

小易觉得高数课太无聊了,决定睡觉。不过他对课上的一些内容挺感兴趣,所以希望你在老师讲到有趣的部分的时候叫醒他一下。你知道了小易对一堂课每分钟知识点的感兴趣程度,并以分数量化,以及他在这堂课上每分钟是否会睡着,你可以叫醒他一次,这会使得他在接下来的k分钟内保持清醒。你需要选择一种方案最大化小易这堂课听到的知识点分值。

输入描述:

第一行 n, k (1 <= n, k <= 105) ,表示这堂课持续多少分钟,以及叫醒小易一次使他能够保持清醒的时间。
第二行 n 个数,a1, a2, … , an(1 <= ai <= 104) 表示小易对每分钟知识点的感兴趣评分。
第三行 n 个数,t1, t2, … , tn 表示每分钟小易是否清醒, 1表示清醒。

输出描述:

小易这堂课听到的知识点的最大兴趣值。

输入例子1:

6 3
1 3 5 2 5 4
1 1 0 1 0 0

输出例子1:

16

最初写了两层暴力循环,计算在不同时间叫醒的兴趣评分

import sys
line1 = sys.stdin.readline().split()
line1 = list(map(int, line1))
n, k = line1[0], line1[1]a = sys.stdin.readline().split()
a = list(map(int, a))t = sys.stdin.readline().split()
t = list(map(int, t))knowledge = []
if k>=n:print(sum(a))
else:for i in range(n-k):grade = 0for j in range(i):if t[j] ==1:grade+=a[j]for j in range(i,i+k):grade += a[j]for j in range(i+k,len(a)):if t[j] == 1:grade +=a[j]knowledge.append(grade)print(max(knowledge))

结果…

您的代码已保存
运行超时:您的程序未能在规定时间内运行结束,请检查是否循环有错或算法复杂度过大。
case通过率为60.00%

那咋算呢,这回算 长度为k 的窗口内,叫醒比不叫醒增加的兴趣分吧。因为醒着的分数是固定的。分数能得到提升是因为叫醒增加的。找到叫醒增加最多的就好了

import sys
line1 = sys.stdin.readline().split()
line1 = list(map(int, line1))
n, k = line1[0], line1[1]a = sys.stdin.readline().split()
a = list(map(int, a))t = sys.stdin.readline().split()
t = list(map(int, t))# 醒着的得分
base_score =0
for i in range(n):base_score += a[i]*t[i]# 叫醒增益
gain = 0
if k >= n:print(sum(a))
else:for i in range(n):# 找到叫醒的点g = 0if t[i] ==0:# 开始计算叫醒的增益for j in range(i,min(i+k,n)):if t[j] ==0:g+=a[j]if g>gain:gain = gprint(gain+base_score)

结果…比上次进步了一点点:

运行超时:您的程序未能在规定时间内运行结束,请检查是否循环有错或算法复杂度过大。
case通过率为80.00%

所以算法的问题是太慢了。。O(n2)O(n^2)O(n2)肯定是不行的。。
接下来想办法写O(n)O(n)O(n)
牛客上讨论的一个答案是这样的, 这个和下面的答案意思差不多。但下面那个更简洁好懂一些。

nk = list(map(int,input().split()))
n = nk[0]
k = nk[1]
a = list(map(int,input().split()))
t = list(map(int,input().split()))max = 0 #记录前k个瞌睡叫醒后兴趣的最大值
for i in range(k):if(t[i]==0):max += a[i]pos = 0 #记录最大值的位置
pre = 0 #记录窗口移动过程中最后一个元素位置( 应该是窗口最前面的一个元素的位置,就是移动就要被淘汰的元素)
cur = max  #当前窗口内的兴趣值for i in range(k,n):if(t[pre]==0):  #元素过期  前一个叫醒点cur -= a[pre] # 当前窗口减去淘汰值if(t[i]==0): # 新的叫醒点cur += a[i]  #当前窗口加入新的值pre += 1 # 窗口后移了一位if(cur>max): # 更新最大值max=curpos=isum=0  #记录清醒状态下的和
for i in range(n):if(t[i]==1):sum+=a[i]
print(sum+max)

(出于规范,建议不要用sum,和max做变量名吧)

下面这个代码比较好懂!

n, k = list(map(int, input().strip().split()))
a = list(map(int, input().strip().split()))
t = list(map(int, input().strip().split()))base_score = 0
for i in range(n):if t[i]:base_score += a[i]a[i] = 0  # 计算完醒着的得分,把得分置为0,这样就不用费力气去找叫醒点。大小为k的窗口每次后移一个就好,醒着的值为0不影响
max_score = tmp = sum(a[:k])  # max_score记录叫醒增益。 tmp记录当前窗口的增益
for i in range(k, n):  # 第二个开始的窗口的末尾范围是 k~n-1tmp = tmp + a[i] - a[i - k] # 后移了一位,新窗口增益是 旧tmp + 新增的值a[i] - 过期的值a[i-k]max_score = max(max_score, tmp) # 如果右移一位增益变大,则更新max_score
ans = base_score + max_score # 最终得分就是醒着的得分加叫醒增益
print(ans)

【刷题日记】网易——瞌睡相关推荐

  1. 菜菜的刷题日记 | 66.加一 Plus One

    系列索引:菜菜的刷题日记 | 被LeetCode用Python狂虐的那段日子 菜鸡的刷题之路--2022/1/7 文章目录 [题目] [我的代码] [参考代码1] [参考代码2] [参考代码3] [思 ...

  2. 一个算法笨蛋的12月leetCode刷题日记

    类似文章 一个算法笨蛋的2021年11月leetCode刷题日记 一个算法笨蛋的2021年12月leetCode刷题日记 一个算法笨蛋的2022年1月leetCode刷题日记 一个算法笨蛋的2022年 ...

  3. 牛客刷题日记(2021-12-8)

    牛客刷题日记(2021-12-8) 题目: 以下哪个接口的定义是正确的?( )interface B { void print() { } ;}interface B { static void pr ...

  4. 刷题日记【第十三篇】-笔试必刷题【数根+星际密码+跳台阶扩展问题+快到碗里来】

    刷题日记[第十三篇]-笔试必刷题[数根+星际密码+跳台阶扩展问题+快到碗里来] 1.方法区在JVM中也是一个非常重要的区域,它与堆一样,是被[线程共享]的区域. 下面有关JVM内存,说法错误的是?(c ...

  5. CTFshow刷题日记-MISC-图片篇(上)基础操作和信息附加

    ctfshow 图片篇引语 大部分题目仅涉及单一知识点,但可能有多种解法: 找到flag并不困难,关键是了解每一题背后的原理: 藏在哪?为什么可以这样藏?请多考虑这两个问题: misc脑图-misc之 ...

  6. 牛客刷题日记(2021-11-24)

    牛客刷题日记(2021-11-24) 题目: 下面程序的输出是:() String x="fmn"; x.toUpperCase(); String y=x.replace('f' ...

  7. Leetcode刷题日记(十二)

    又是老台词:欢迎大家来到一晚一度的leetcode刷题日记时间.今天我们来讲讲队列的问题,队列这方面的基础知识需要的同学到博主前面的文章找吧.队列这方面的问题平时博主也是接触得比较少的.下面是一道利用 ...

  8. 菜菜的刷题日记 | 蓝桥杯 — 十六进制转八进制(纯手撕版)附进制转换笔记

    系列索引:菜菜的刷题日记 | 被LeetCode用Python狂虐的那段日子 万万没想到啊,回老家过年断更的几天之后,我会因为无聊在除夕这天做了会儿题,然后写篇题解. 文章目录 [题目] [我的代码] ...

  9. 菜菜的刷题日记 | 12.整数转罗马数字

    系列索引:菜菜的刷题日记 | 被LeetCode用Python狂虐的那段日子 菜鸡的刷题之路--2022/1/24,这几天忙着肝并发编程,题在做但是没空写题解,今晚补一篇. 文章目录 [题目] [官方 ...

  10. Leetcode刷题日记:21-25题篇

    Leetcode刷题日记:21-25题篇 简介 题目: 21. 合并两个有序链表 22. 括号生成 23. 合并K个升序链表 24. 两两交换链表中的节点 25. K 个一组翻转链表 注 简介 这个系 ...

最新文章

  1. SPRING事务传播特性
  2. 太逗了,面试官让我讲线程 WAITING 状态!
  3. r语言error in match.fun(fun) :_Go语言200行写区块链源代码分析
  4. ajax实现浏览器前进后退-location.hash与模拟iframe
  5. Spark 常见问题小结
  6. java怎么碰到异常跳过继续执行_Java异常处理很难吗?BAT大厂的架构师是怎么处理Java异常的?...
  7. 如何检测支付宝接口中notify_url.php有没有返回,微信小程序支付成功,但是notify_url接收不到回调如何排查此问题?...
  8. Egret3D初步笔记二 (Unity导出场景使用)
  9. 用360安全卫士批量本地快速给系统打补丁【转贴】
  10. 小米路由器mini刷Breed,安装固件教程
  11. 屏幕录像专家 EXE视频转MP4
  12. 川希:哪些网站百度收录快排名好,高权重网站必收藏!
  13. qt 部署 错误_QT for Windows安装配置总结及采坑问题汇总
  14. 今日头条网页数据采集接口
  15. 使用POI读写word doc文件
  16. 李玉刚与石头的雨花石
  17. 固态硬盘跟机械硬盘的区别
  18. A40I led driver
  19. centos 6.3_x64编译7.4 LFS
  20. html添加外链图片代码,web 外链图片 403 解决方案(http referrer)

热门文章

  1. STM32单片机裸机程序-高级实现实时性处理方法
  2. qt实现程序密钥注册功能,MD5加密+AES加密,并实现一台电脑系统一个密钥
  3. java 汉字是多少字节_面试官:Java 中有几种基本数据类型是什么?各自占用多少字节?...
  4. 追踪社保基金操盘者的足迹
  5. unity 字幕滚动
  6. 世界工厂不好当了 东莞面临新一轮企业倒闭潮
  7. itemarray的意思
  8. Qt5把图片如何导出为pdf再到剪切板
  9. android 内部存储 共享,android存储:共享参数、内部存储、拓展存储
  10. CMGCN 2022ACL