1 条题解

  • 0
    @ 2026-5-6 11:22:16

    思路

    双指针解决。

    用一个循环遍历所有的数据中心,根据当前数据中心的可用机器数和剩余机器数,选择分配机器数并存在 temptemp 数组中。具体的分配规则如下:

    • 如果 (mleftme)>(mright(m_ {left} - me) > (m_ {right} 且 leftcopiesleft \geq copies,或者 right>nright \gt n,选择分配 (mleftme)(m _ {left} - me) 个机器,并将 leftleft 指针右移一位。
    • 否则,选择分配 mrightm _ {right} 个机器,并将 rightright 指针右移一位。

    完成所有服务的处理后,将 temptemp 数组中的值复制回 mm 数组,得到每个数据中心剩余的机器数。最后,使用一个循环按降序输出 mm 数组中的值,即为每个数据中心剩余的机器数。

    复杂度 O(ns)O(ns)

    代码

    #include <bits/stdc++.h>
    #define ll long long
    #define ull unsigned long long
    #define ui unsigned int
    
    using namespace std;
    
    int m[100005], temp[100005];
    
    int main() {
        int n, s;
        scanf("%d%d", &n, &s);
    
        for (int i = 1; i <= n; i++) {
            scanf("%d", &m[i]);
        }
    
        sort(m + 1, m + n + 1);
        reverse(m + 1, m + n + 1);
    
        while (s--) {
            int me, copies;
            scanf("%d%d", &me, &copies);
    
            int left = 1, right = copies + 1;
    
            for (int i = 1; i <= n; i++) {
                if ((m[left] - me) > m[right] && left <= copies || right > n) {
                    temp[i] = m[left] - me;
                    left++;
                } else {
                    temp[i] = m[right];
                    right++;
                }
            }
    
            for (int i = 1; i <= n; i++) {
                m[i] = temp[i];
            }
        }
    
        for (int i = 1; i <= n; i++)
        printf("%d ", m[i]);
    
    return 0;
    }
    
    • 1

    信息

    ID
    10179
    时间
    2000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者