解决Runtime Error(SIGSEGV)求助及AC仅得30分问题
很高兴你已经解决了导致Runtime Error(SIGSEGV)的问题——搞定了空容器访问和结果越界的bug,现在代码能AC但只拿到30分,显然是运行时间没达标,下面给你几个实用的优化方向,帮你把分数拉满:
精准优化二分查找的核心逻辑
这个问题本质是典型的二分查找应用,目标是找到满足条件的最小进食速度k。首先要确保二分的边界设置精准:左边界从1开始没问题,右边界直接设为数组里的最大堆值就足够(没必要设更大的数,浪费查找次数)。计算中间值的时候,别用(left + right)/2,换成left + (right - left)/2,能避免整数溢出的问题。另外,判断当前k是否能在H小时内吃完的函数要做减法:计算每堆耗时用(pile + k - 1) // k来快速实现向上取整,比用除法加判断快得多;而且一旦累加的时间超过H,直接返回false,不用再算剩下的堆,能省不少时间。砍掉不必要的容器操作
你之前遇到过v1为空的问题,说明代码里可能有多余的容器创建、拷贝操作。比如如果是把输入数据拷贝到新容器再处理,不如直接在原数组上操作;排序的时候也直接对输入数组排序,别搞额外的拷贝,这样能减少内存开销和拷贝的时间损耗。把输入输出速度拉满
竞赛里超时一大半原因都是输入输出慢。如果用的是C++的cin/cout,一定要加上这两行:ios_base::sync_with_stdio(false); cin.tie(NULL);关闭C和C++流的同步,速度能提升好几倍。如果输入量特别大,直接换成
scanf和printf会更快。避免数据溢出的坑
如果堆的数量多或者每堆食物量大,累加的时间很容易超出int的范围,导致计算错误或者隐性bug。所以计算总耗时的时候,一定要用long long类型来存储,别吝啬这点内存,能避免很多莫名其妙的超时或者错误。
内容的提问来源于stack exchange,提问作者Carlson Bimbuh

