uva-1422-Processor

本文介绍了一个有趣的CPU调度算法实现,通过定义任务结构体并利用优先队列进行任务调度,最终找到能满足所有任务调度条件的时间片长度。代码中详细展示了如何处理任务的到达时间、截止时间和工作量,并通过二分查找确定最优的时间片。

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

题解参见:http://blog.youkuaiyun.com/fobdddf/article/details/20120845

蛮有趣的有关cpu的算法

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>

using namespace std;

#define F(i, n) for (int i=0;i<(n);++i)
#define LBIT(x) x&-x

long long gcd(long long a, long long b) {
    return b == 0 ? a : gcd(b, a % b);
}

template<class T>
void myswap(T * a, T * b) {
    T tmp = *a;
    *a = *b;
    *b = tmp;
}

#define MAXTASK 10000
#define MAXSIZE 20000
#define MAXLEN 1000

typedef struct tast_type{
    int r;
    int d;
    int i;
    int w;

    bool operator < (const tast_type & b) const {
        return d > b.d;
    }
} task;

task tasks[MAXTASK + 1];
int w[MAXTASK + 1];

int T;
int n;
int l, r, mid;


bool comp(const task & a, const task & b) {
    // 这里用 <= 的话
    // sort 的时候可能出现runtime error
    return a.r < b.r;
}

bool check(int mid) {
    priority_queue<task> pri_que;

    // 当前时间片的起始
    // e.g. 时间片0表示 从0开始的一个时间片,长度为1个单位
    int t = 0;
    int index = 0;
    // 当前时间片可处理的任务量的剩余值
    int rest;

    F(i, n)
        w[tasks[i].i] = tasks[i].w;

    while(true) {
        // 将所有可以使用该时间片的任务进队
        while(index < n && tasks[index].r <= t)
            pri_que.push(tasks[index++]);

        rest = mid;
        while(pri_que.size() && rest > 0) {
              task fr = pri_que.top();
              if (fr.d <= t)
                return false;
              else {
                if (w[fr.i] <= rest) {
                    rest -= w[fr.i];
                    pri_que.pop();
                } else {
                    w[fr.i] -= rest;
                    rest = 0;
                }
              }
        }

        // 所有任务都处理完了
        if (index >= n && (pri_que.size() == 0))
            break;

        ++t;
    }

    return true;
}

int main()
{
    freopen("input.in", "r", stdin);

    cin >> T;

    F(cases, T) {
        cin >> n;
        F(i, n) {
            cin >> tasks[i].r >> tasks[i].d >> tasks[i].w;
            tasks[i].i = i;
        }

        sort(tasks, tasks + n, comp);

        l = 0, r = 5000;

        while(r - l > 1) {
            mid = l + (r - l) / 2;
            if (check(mid))
                r = mid;
            else
                l = mid;
        }

        cout << r << endl;
    }

    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值