题解 | 小红的平滑值插值

小红的平滑值插值

https://www.nowcoder.com/practice/97f6b71b1df745cd9926eb861e2d89df

首先考虑当前数组a的平滑值小于k的情况,这时我们可以选取任意的区间[i,i+1],其中i<=1<=n-1,选择在下标i和i+1中间插入值min(a[i],a[i+1])+k,就可以构造出数组a的平滑值刚好等于k的情况。

再考虑当前数组a的平滑值大于k的情况,此时存在若干区间[j,j+1]使得abs(a[j+1]-a[j])>k,思考一下如何插值可以使得总答案次数最小,我们会想到贪心地插差值绝对值刚好为k的数会比较合适。举例:如样例中下标1的值a[1]=1和下标2的值a[2]=4,它们差值绝对值为3,我们就可以插入一个值min(a[1],a[2])+k;再看样例中下标为3的值a[3]=5和下标为4的值a[4]=1,它们差值绝对值为4,我们也只需要插入min(5,1)+2=3;考虑若此时存在差值绝对值为5应该需要插入几个数,应该是2个,如往数值1和6之间插入3和5。我们归纳总结一下,发现如果存在相邻两个数的差值绝对值大于k时,我们需要插入ceil(d/k)-1个数,其中ceil表示上取整函数,而d表示相邻两个数的差值绝对值。

最后观察数据范围,发现答案极有可能爆int,因此答案要开long long。而上述操作总的来说只会遍历一遍1~n,时间复杂度为O(n),不会超时。

#include <iostream>
#include <vector>

using i64 = long long;

int main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);
  std::cout.tie(nullptr);

  int n,k;
  std::cin >> n >> k;

  std::vector<int> a(n);
  for(int i = 0; i < n; i++){
    std::cin >> a[i];
  }

  i64 ans = 0;
  int maxDiff = 0;

  for(int i = 0; i < n-1; i++){
    maxDiff = std::max(maxDiff,std::abs(a[i+1]-a[i]));
    int d = std::abs(a[i+1]-a[i]);
    if(d <= k){
      continue;
    }

    ans +=(d+k-1)/k-1;
  }

  if(maxDiff < k){
    std::cout << "1\n";
    return 0;
  }

  std::cout << ans << "\n";
}

全部评论

相关推荐

时间线:&nbsp;1.4-1.5:&nbsp;boss&nbsp;牛客&nbsp;官网&nbsp;实习僧海投了两天,&nbsp;感觉确实没啥招人的啊,&nbsp;心里凉了一半.1.6:&nbsp;中午快手约面,&nbsp;下午字节hr飞书私聊约面,&nbsp;当时想着第一次面大厂感觉三个过一个一面就已经赢了.1.7:&nbsp;下午&nbsp;3点大厂处女面,&nbsp;哈哈面试官是重邮红岩的直接保送;&nbsp;5点快手一面,&nbsp;我说这个是我的第二次大厂面试,&nbsp;面试官问要是拿到字节和快手选择哪个,&nbsp;我说昨天看了一晚上快手百分百选快手哈哈哈.&nbsp;晚上5.30字节约二面,&nbsp;快手约二面,&nbsp;小红书约一面.1.8:&nbsp;下午2点快手二面,&nbsp;聊天面体验非常好(当天电话确认入职时间);&nbsp;4点字节二面这次不是校友了,&nbsp;然后有一个CSS实现switch效果的忘记属性咋写了,&nbsp;感觉危了;&nbsp;7.30&nbsp;问字节hr是不是挂了;&nbsp;9点开始小红书一面,&nbsp;难死我了,&nbsp;但我还是笑着面完了,&nbsp;然后卸载了小红书,&nbsp;但是过了一会会小红书hr约二面,&nbsp;遂下回来了字节约三面.1.9:&nbsp;下午2点字节三面,&nbsp;依旧聊天+算法,&nbsp;自己太菜了有一个写错了,&nbsp;面完感觉又危了;&nbsp;5点面小红书20min结束(offer审批);5.30又去问字节hr是不是挂了,&nbsp;hr小姐姐说干嘛用一个句式,&nbsp;我说手写题又又又没写出来😂,&nbsp;2min后约hr面;8.30&nbsp;快手offer总结,&nbsp;自己运气好遇到了好公司好部门好面试官,&nbsp;字节剪映&nbsp;快手电商&nbsp;小红书支付的面试体验都非常好,&nbsp;不会的题会带你一步一步思考,&nbsp;流程也非常快全部都是当天推进,&nbsp;小红书是以分钟为单位推进.&nbsp;&nbsp;面经以及细节等我慢慢整理,&nbsp;&nbsp;以及保佑所有的审批不要出问题,&nbsp;我是真怕最后全过了0offer😂bg:&nbsp;重邮&nbsp;大数据&nbsp;蓝山工作室&nbsp;一段非大厂实习
独角仙梦境:这是真👻了
找实习记录
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务