2025华为软件精英挑战赛2600w思路分享

这里写自定义目录标题

得分展示


对象定义

cpp 复制代码
// 将一个磁盘划分为多个基于标签聚合的区块
class Block{
public:
    int tag = 0;   // 区块标签
    int start_pos;
    int end_pos;
    int id;
    int use_size = 0;
    int v;

    // 为区块确定范围
    Block(int id, int v) : id(id), v(v){
        start_pos = (id - 1) * BLOCK_SIZE + 1;
        end_pos = min(id * BLOCK_SIZE, v);
    }
};

class Object{
public:
    int disk[REP_NUM + 1];    // 对象的三个副本磁盘 id
    int *unit[REP_NUM + 1];   // 每个副本中对象块的存储单元索引
    int obj_id = 0;
    int obj_size = 0;
    int obj_tag = 0;
    int last_request_point = 0; // 挂接未完成请求链头
    bool is_del = false;
    bool *block_read_status = nullptr;

    Object() {
        for (int i = 1; i <= REP_NUM; i++){
            unit[i] = new int[MAX_DISK_SIZE];
        }
    }
};

class Disk{
public:
    int id = 0;
    pair<int, int> item[MAX_DISK_SIZE];
    int p = 1;                        // 磁头的位置
    char last_action = '$';
    int last_token_cost = 0;
    int used_tokens = 0;
    int disk_size = 0;
    vector<pair<int, int>> done_request;
    vector<int> request;       // 这个磁盘中的请求

    vector<Block> disk_blocks;
    int block_group_num;
    void initBlock(int num, int v){
        block_group_num = num;
        disk_blocks.push_back(Block(0, 0));
        for (int i = 1; i <= block_group_num; i++){
            disk_blocks.push_back(Block(i, v));
        }
    }


    Disk(){
        memset(item, 0, sizeof(item));
    }



    int calculateReadToken(Disk &disk){
        if (disk.last_action != 'r'){
            return 64;
        }else{
            float token = disk.last_token_cost * 0.8f;
            token = ceil(token);
            return max(16, int(token));
        }
    }
};


class Request{
public:
    int req_id = 0;
    int obj_id = 0;
    int prev_id = 0;
    int arri_time = 0;
    bool is_done = false;
    float score = 0.0f;
    bool *block_read_status = nullptr;
};

请求价值计算

cpp 复制代码
float get_score(int x){
    if (x <= 10){
        return -0.005 * x + 1.0;
    }else if(x <= 105){
        return -0.01 * x + 1.05;
    }else{
        return -1.0;
    }
}

时间同步

cpp 复制代码
void handle_timestamp(){
    string t;
    cin >> t >> current_time;
    cout << "TIMESTAMP " << current_time << endl;
    fflush(stdout);
}

删除操作

cpp 复制代码
void delete_action(){
    // 1 读取删除的个数
    int n_delete;
    cin >> n_delete;

    // 2 读取并记录所有删除的 对象id
    vector<int> deletes(n_delete);
    for (int i = 0; i < n_delete; i++)
        cin >> deletes[i];

    // 3 计算所有的终止 读请求 id
    vector<int> abort_reqs;
    for (int id : deletes){
        int curr_id = objects[id].last_request_point;
        while (curr_id != 0){
            if (!requests[curr_id].is_done){
                abort_reqs.push_back(curr_id);
                requests[curr_id].is_done = true;
            }
            curr_id = requests[curr_id].prev_id;
        }
    }

    // 4 输出终止的请求个数
    cout << int(abort_reqs.size()) << endl;

    // 5 输出所有的终止请求 id
    for (int req_id : abort_reqs){
        cout << req_id << endl;
    }

    // 6 执行删除操作
    for (int id : deletes){
        int curr_id = objects[id].last_request_point;
        while (curr_id != 0){
            if (!requests[curr_id].is_done){
                cout << curr_id << endl;
            }
            curr_id = requests[curr_id].prev_id;
        }
        for (int rep = 1; rep <= REP_NUM; rep++){
            int disk_id = objects[id].disk[rep];
            if (disk_id < 1 || disk_id > N)
                continue;
            do_object_delete(objects[id].unit[rep], disks[disk_id], objects[id].obj_size);
        }
        objects[id].is_del = true;
    }
    fflush(stdout);
}

完整思路

查看

相关推荐
g***B7381 小时前
Java 工程复杂性的真正来源:从语言设计到现代架构的全链路解析
java·人工智能·架构
期待のcode3 小时前
MyBatisX插件
java·数据库·后端·mybatis·springboot
Lei活在当下5 小时前
【项目踩坑实录】并发环境下,Glide缓存引起的图片加载异常
android·debug·glide
醇氧5 小时前
【Windows】优雅启动:解析一个 Java 服务的后台启动脚本
java·开发语言·windows
sunxunyong5 小时前
doris运维命令
java·运维·数据库
菜鸟起航ing5 小时前
Spring AI 全方位指南:从基础入门到高级实战
java·人工智能·spring
古城小栈6 小时前
Docker 多阶段构建:Go_Java 镜像瘦身运动
java·docker·golang
MapGIS技术支持6 小时前
MapGIS Objects Java计算一个三维点到平面的距离
java·开发语言·平面·制图·mapgis
Coder_Boy_6 小时前
业务导向型技术日志首日记录(业务中使用的技术栈)
java·驱动开发·微服务
盖世英雄酱581367 小时前
springboot 项目 从jdk 8 升级到jdk21 会面临哪些问题
java·后端