带有最终期限的调度安排

头文件:#include<algorithm>
格式: sort(a,a+n)代表从a首地址到a的尾地址.sort(a,a+n,cmp)

cmp为自定义的函数,使得sort按自己的意愿排序.

1.bool cmp(类型名称 a,类型名称 b){return a>b;} 使得数组从大到小排序
2.bool cmp(结构体名称 a,结构体名称 b){return a.data1>b.data1;} 使得结构体按data1从大到小排序(从小到大一样原理

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
//算法4.4  带有最终期限的调度安排
struct task {
    int id;
    int deadline;
    int profit;
};
bool cmpProfit(task t1, task t2)
{
    return t1.profit > t2.profit;
}
bool cmp2Deadline(task t1, task t2)
{
    return t1.deadline < t2.deadline;//一开始敲的时候,这个地方是第一个错误,排序排错了
}
//判断是否是可行序列,可行序列的定义是:如果一个序列中所有任务都在其最终期限之前启动,
//则将这个序列成为可行序列(feasible sequence)
bool feasible(task *t, int n)
{
    int sum = 1;
    for (int i = 0; i < n; i++)
    {
        if (t[i].deadline<sum)
        {
            return false;
        }
        sum++;
    }
    return true;
}


vector<task> schedual(int n, task *t)//泛型
{
    vector<task> temptask;
    //temptask.push_back(t[0]);
    //根据已经排好序的收益值,不断地添加任务
    for (int i = 0; i < n; i++)
    {
        temptask.push_back(t[i]);
        /*
        判断容器里的任务是否是可行序列之前,需要按照最终期限先进行排序
        因为有这样一个引理(见书本109页最下方引理4.3):
        设S是一个任务集合,则S为可行序列的充要条件是:
        根据非递减顺序最终期限对S中的任务进行排序,所得到的序列是可行的。
        (当然需要用feasible函数进行判断一下(I think~))
        */
        int y = 0;
        task ttask[10];
        vector<task>::iterator it;
        for (it = temptask.begin(); it != temptask.end(); it++)
        {
            ttask[y++] = *it;
        }
        //y--;//ttask的长度不能将y--,否则排序就不对了,这是我犯得第二个错误
        sort(ttask, ttask + y, cmp2Deadline);//将其按照deadline非递减排序
        //以上是排序过程,下面判断是不是可行序列
        if (!feasible(ttask, y))//如果不是可行序列,则拒绝该任务的加入
        {
            temptask.pop_back();
        }
        memset(ttask, 0, sizeof(ttask));
    }
    //所有的任务都遍历一遍之后,按理说容器temptask里的任务全部是可行任务了
    return temptask;
}
int main()
{
    task t[10];
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> t[i].id >> t[i].deadline >> t[i].profit;
    }
    sort(t, t + n, cmpProfit);//将其按照Profit非递减顺序排序
    vector<task> ta;
    ta = schedual(n, t);
    vector<task>::iterator it;
    task ttemp[10];
    int k = 0;
    for (it = ta.begin(); it != ta.end(); it++)
    {
        ttemp[k++] = *it;
    }
    //k--;//不能--,最后调了好久才发现是这里错了!!!!想哭!!
    for (int m = 0; m < k; m++)
    {
        cout << ttemp[m].id << " " << ttemp[m].deadline << " " << ttemp[m].profit << endl;
    }

    system("pause");
    return 0;
}

有如下任务:

任务ID          最终期限             收益值
  7               2                 10
  6               3                 15
  5               1                 20
  4               3                 25
  3               1                 30
  2               1                 35
  1               3                 40

测试用例
7
7 2 10
6 3 15
5 1 20
4 3 25
3 1 30
2 1 35
1 3 40

输出结果
1 3 40
2 1 35
4 3 25

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值