博客
关于我
CodeForces 1484D Playlist 思维暴力
阅读量:502 次
发布时间:2019-03-07

本文共 971 字,大约阅读时间需要 3 分钟。

今天,我遇到了一个编程题,看起来有点难但不算太难。题目是给定一个数组,从第1个元素开始循环检查,如果两个元素的gcd为1(注意i循环到最后一个元素时,要比较a[n]和a[1]),那么就把右边的那个元素移除。并且不能连续移除两个元素。最后要求输出被移除的元素的数量以及移除的顺序。我觉得这个问题可以通过一些巧妙的方法解决,所以决定好好思考一下。

首先,我想到如果用暴力方法,每次都遍历数组检查,时间复杂度可能会很高,特别是当数组很大时。这样做效率太低了,所以得找有没有更高效的解法。于是,我在想应该利用一个数组记录每个元素的下一个元素,这样在处理完移除操作后,可以通过索引跳转很快找到下一个需要被检查的位置。

于是,我打算如下做:

  • 初始化一个数组li,记录每个元素的右边元素,初始时li[i] = i+1。
  • 创建一个队列或者临时列表t,来记录需要处理的位置。
  • 遍历数组,如果找到满足条件的i(即gcd(a[i], a[li[i]])=1),则记录i到t,并标记li[i]为需要处理的元素,同时更新li[i]为它的下一个元素,这样下次循环时,就能直接跳过过多检查。
  • 重复上述过程,直到队列处理完毕。
  • 最后,处理队列中的i,记录移除的顺序和数量。
  • 在实现的时候,需要注意一些细节:

    • 初始化时li[n]要指向1,避免在循环最后一个元素时比较错误。
    • 在检查的时候,需要避免已被处理的节点重复处理。
    • 每次找到一个i,立即标记li[i]为“处理中”,并跳过后续检查,直接处理下一个i。
    • 在特殊情况下,比如数组只有一个元素(n=1),可能不会发生移除操作。

    关于数据结构的选择,我认为用一个数组存储每个节点右边的下一个节点是比较方便的,这样可以比列表更高效一些,尤其是在大数组中改变节点的位置时。

    总结一下,我的思路就是:

    • 用一个数组记录每个节点的右边元素。
    • 用一个队列记录需要处理的节点。
    • 每次循环,处理队列中的节点,记录移动后的顺序。
    • 避免重复处理节点,提高效率。

    这样的方法应该可以在O(n)的时间复杂度内解决问题,适用于较大的输入规模。如果你觉得这个思路清晰,可以试着写出代码。

    在实际代码中,我也会注意一些细节,比如如何处理第一个节点i=1,以及当节点被多次重新连结时如何处理指针。外加,确保每一步都正确地更新指针,这样才能防止小数组时出现的问题。

    转载地址:http://dpnjz.baihongyu.com/

    你可能感兴趣的文章
    NotImplementedError: Could not run torchvision::nms
    查看>>
    nova基于ubs机制扩展scheduler-filter
    查看>>
    Now trying to drop the old temporary tablespace, the session hangs.
    查看>>
    nowcoder—Beauty of Trees
    查看>>
    np.arange()和np.linspace()绘制logistic回归图像时得到不同的结果?
    查看>>
    np.power的使用
    查看>>
    NPM 2FA双重认证的设置方法
    查看>>
    npm build报错Cannot find module ‘webpack/lib/rules/BasicEffectRulePlugin‘解决方法
    查看>>
    npm build报错Cannot find module ‘webpack‘解决方法
    查看>>
    npm ERR! ERESOLVE could not resolve报错
    查看>>
    npm ERR! fatal: unable to connect to github.com:
    查看>>
    npm ERR! Unexpected end of JSON input while parsing near '...on":"0.10.3","direc to'
    查看>>
    npm ERR! Unexpected end of JSON input while parsing near ‘...“:“^1.2.0“,“vue-html-‘ npm ERR! A comp
    查看>>
    npm error Missing script: “server“npm errornpm error Did you mean this?npm error npm run serve
    查看>>
    npm error MSB3428: 未能加载 Visual C++ 组件“VCBuild.exe”。要解决此问题,1) 安装
    查看>>
    npm install CERT_HAS_EXPIRED解决方法
    查看>>
    npm install digital envelope routines::unsupported解决方法
    查看>>
    npm install 卡着不动的解决方法
    查看>>
    npm install 报错 EEXIST File exists 的解决方法
    查看>>
    npm install 报错 ERR_SOCKET_TIMEOUT 的解决方法
    查看>>