博客
关于我
D. Equalize the Remainders[模拟+set中lower_bound效率问题]
阅读量:527 次
发布时间:2019-03-08

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

要解决这个问题,我们需要按照以下步骤进行:

  • 初始化数据结构: 使用一个或多个有序集合(如C++中的set)来维护余数状态,确保快速查找和插入操作。

  • 计算目标频率: 确定每个余数应出现的次数,即两次计算:need = n / m

  • 读取输入数组: 将数组中的每个数模m,得到当前的余数。

  • 排序和处理数组: 将数组按余数排序,然后确定哪些元素需要调整,以满足每个余数出现need次的要求。

  • 生成最终数组: 根据上述调整生成最终的数组,每次只增加1,计算总操作次数。

  • 示例代码解析:

    #include 
    using namespace std;void main() { // 读取输入 int n, m; for(int i=1; i<=n; ++i) a[i] = ...; // 初始化数组中各元素的模余 ll sum[m], cnt[m], ans = 0; // 设定目标每个余数出现的次数 int need = n / m; // 读取输入并处理 for(int i=1; i<=n; ++i) { a[i] = ...; int mo = a[i] % m; if (mo > *set.rbegin()) { // 当前余数比最大值大,需要将最小的元素调整到该余数 ... } else { // 调整为目标余数,使用lower_bound确定插入位置 auto it = set.lower_bound(mo); // 计算需要的移动次数 ans += it->second - it->first; // 更新sum和cnt数组 cnt[mo]++; } } // 输出结果 for(int i=1; i<=n; ++i) { cout << a[i] << " "; } cout << ans << endl;}

    关键步骤说明:

  • 初始化数据结构: 使用set来维护当前余数状态,确保快速查找和插入,最坏情况下每个操作O(log n)。

  • 计算需要的次数: 确定每个余数必须出现的次数,如need = n/m

  • 处理每个元素: 对每个元素计算其模m的余数,并根据当前集合中的最大余数决定是否需要调整。

  • 调整元素到目标余数: 使用lower_bound找到目标余数的位置,计算移动次数,并更新计数器。

  • 总操作次数: 累加每次调整的次数,得到总操作次数。

  • 示例解释:

    假设n=4,m=2,那么每个余数应出现2次。假设初始数组为[1,3,2,4],对应的余数为1,1,0,0。然后需要调整使得两个余数0和两个余数1。

    • 调整最小的数1(当当前余数1比最大值大时)。
    • 调整3到余数0。
    • 调整2到余数1。
    • 调整4可能无需调整。

    总操作次数为:(1)3到0需要加3次 decrease,但是因为只能加1,所以需要查找下一个余数为0的位置。例如,如果当前余数可以调整到0,可能需要移动的次数是该位置到当前的位置。这里需要重新计算具体移动次数。

    最终数组为:[0,1,1,0],操作次数总和为5次。

    这个过程展示了如何通过分析和调整元素的余数,以及利用适当的数据结构来确保最小化操作次数。

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

    你可能感兴趣的文章
    Netty工作笔记0020---Selectionkey在NIO体系
    查看>>
    Vue踩坑笔记 - 关于vue静态资源引入的问题
    查看>>
    Netty工作笔记0025---SocketChannel API
    查看>>
    Netty工作笔记0027---NIO 网络编程应用--群聊系统2--服务器编写2
    查看>>
    Netty工作笔记0050---Netty核心模块1
    查看>>
    Netty工作笔记0057---Netty群聊系统服务端
    查看>>
    Netty工作笔记0060---Tcp长连接和短连接_Http长连接和短连接_UDP长连接和短连接
    查看>>
    Netty工作笔记0063---WebSocket长连接开发2
    查看>>
    Netty工作笔记0070---Protobuf使用案例Codec使用
    查看>>
    Netty工作笔记0077---handler链调用机制实例4
    查看>>
    Netty工作笔记0084---通过自定义协议解决粘包拆包问题2
    查看>>
    Netty工作笔记0085---TCP粘包拆包内容梳理
    查看>>
    Netty常用组件一
    查看>>
    Netty常见组件二
    查看>>
    netty底层源码探究:启动流程;EventLoop中的selector、线程、任务队列;监听处理accept、read事件流程;
    查看>>
    Netty心跳检测机制
    查看>>
    Netty核心模块组件
    查看>>
    Netty框架内的宝藏:ByteBuf
    查看>>
    Netty框架的服务端开发中创建EventLoopGroup对象时线程数量源码解析
    查看>>
    Netty源码—2.Reactor线程模型一
    查看>>