ICPC2021 网络赛1(9月19日场) A题

题意

给定k个计算点和n个计算任务,每个计算任务给定一个开始时间和一个持续时间,对于第i个任务从i % k开始向后查找有没有空闲的计算点(查到最后一个后从0在开始查),如果都为非空闲状态,就跳过这个任务,问哪个计算点得到的任务最多

思路

这个题目看数据范围, n=1e5,k=1e5, 写一个nk的模拟就T了,所以考虑利用set的lower_bound()来二分查找空闲的计算点,然后用一个优先队列对结束时间进行维护(小根堆)

感谢赛后蹦豆和我讨论了一波思路

代码

#include <bits/stdc++.h>

using namespace std;

const int maxn = 2e5 + 20;
int n, k;
int record[maxn];
set<int> s;  // 空闲的计算点
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>>
    heap;  // pair<完成时间, 负责这个任务的计算点的标号>

void init() {
    for (int i = 0; i < k; ++i) {
        s.insert(i);
    }
    memset(record, 0, sizeof(record));
}

void check_finish(int now) { // 检查heap中有没有已经完成的任务,把完成的计算点标号放进set里
    while (!heap.empty()) {
        auto i = heap.top(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值