M台机器用来服务用户,我们把机器编号成0到M。每台机器有多个CPU核,我们把核编号为0到Cm

本文探讨了智能算法在大数据开发领域的应用,包括Hadoop、Spark等技术的使用,以及如何通过算法优化数据处理效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
#include <cstdio>
#include <vector>
#include <set>
#include <cstring>

using namespace std;

const int N = 100005;
const int M = 130;
const int inf = 1e9;

struct Query{    //保存每一次询问的结果,id为机器编号,start为CPU起点,end为CPU终点
    int id, start, end;    
    Query (){}
    Query (int a, int b, int c):id(a), start (b), end (c){}
};

bool a[N][M];        //记录每个机器CPU的使用情况
int sz[N];            //记录每个机器CPU数

/*
 * 返回当前机器中连续num个空闲核的起点
 */
int getStart (bool used[], int size, int num){
    int now = 0;
    for (int i = 1; i <= size; i ++){
        if (!used[i]){
            now ++;
            if (now == num){
                return i - now + 1;
            }
        }else{
            now = 0;
        }
    }
    return -1;
}

/*
 * 返回当前机器最大连续空闲核的数量
 */
int getMax (bool used[], int size){
    int maxx = 0;
    int t = 0;
    for (int i = 1; i <= size; i ++){
        if (!used[i]){
            t ++;
            maxx = max (maxx, t);
        }else{
            t = 0;
        }
    }
    return maxx;
}

int main (){
    freopen ("1.txt", "r", stdin);
    freopen ("3.txt", "w", stdout);
    int T, cas = 1;
    scanf ("%d", &T);
    while (T --){
        memset (a, 0, sizeof (a));
        set<int> se[M];        //se[i]存储的是连续空闲数为i的所有机器编号
        vector<Query> vec;    //保存历史询问
        printf ("Case #%d:\n", cas ++);
        int n, m;
        scanf ("%d%d", &n, &m);
        for (int i = 1; i <= n; i ++){
            scanf ("%d", sz + i);
            se[sz[i]].insert (i);
        }
        while (m --){
            char op[5];
            int t;
            scanf ("%s%d", op, &t);
            if (op[0] == 'A'){
                int id = inf;
                for (int i = t; i < M; i ++){
                    if (se[i].size ()){
                        id = min (id, *se[i].begin ());
                    }
                }
                if (id == inf){
                    puts ("-1 -1");
                    vec.push_back (Query (-1, -1, -1));
                }else{
                    se[ getMax (a[id], sz[id]) ].erase (id);
                    int start = getStart (a[id], sz[id], t);
                    printf ("%d %d\n", id, start);
                    for (int i = start; i <= start + t - 1; i ++){
                        a[id][i] = true;
                    }
                    vec.push_back (Query (id, start, start + t - 1));
                    se[ getMax (a[id], sz[id])].insert (id);
                }
            }else{
                t --;
                if (vec[t].id == -1)    continue;
                int id = vec[t].id;
                se[ getMax (a[id], sz[id]) ].erase (id);
                for (int i = vec[t].start; i <= vec[t].end; i ++){
                    a[id][i] = false;
                }
                se[ getMax (a[id], sz[id]) ].insert (id);
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值