头文件:#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