贪心策略(三)多机调度问题、活动选择(库函数sort的整理)

把sort库函数的使用总结一下:

1、头文件#include<algorithm>   时间复杂度nlog(n)

2、使用格式 sort(arr.begin(), arr.end());

3、默认使用升序排序,第三个参数默认使用less<T>()

4、如果需要进行降序排序,可以加入第三个参数为greater<T>()   (T可以使用默认模板参数,也可以自己直接给出,比如要排序的数组存放int类型元素,直接给出int即可)

5、使用greater<T>()  与  less<T>() 需要引入头文件#include<functonal>

6、还可以根据自己的想法写出一个仿函数来进行比较,比如一个二维数组,我需要根据每个数组中的第二个元素进行排序:

class Com
{
public:
    bool operator()(const vector<int>& left, const vector<int>& right)
    {
        return left[1] < right[1];
    }
};

 多机调度问题(贪心)

某工厂有n个独立的作业,由m台相同的机器进行加工处理。作业i所需的加工时间为ti,任何作业在被处理时不能中断,也不能进行拆分处理。现厂长请你给他写一个程序:算出n个作业由m台机器加工处理的最短时间
输入
        第一行T(1<T<100)表示有T组测试数据。每组测试数据的第一行分别是整数

        n,m(1<=n<=10000,
        1<=m<=100),接下来的一行是n个整数ti(1<=t<=100)。
输出
        所需的最短时间

 按照加工时间长短进行排序

首先进行区分,如果机器个数大于等于任务个数那么直接每台机器一个任务,找最大任务时间即可

当任务个数更多时,给每个机器分配时间最长的任务,然后按顺序将剩余的任务按时间高低逐个安排给最新运行完成的机器。

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
#include<functional>
class Com
{
public:
	bool operator()(const int& left, const int& right)
	{
		return left > right;
	}
};

class solution
{
public:
	int MinTime(vector<int> work, int m)
	{
		sort(work.begin(), work.end(), Com());
		// sort(work.begin(), work.end(), greater<int>());
		int n = work.size();
		if (m >= n)
			return work[0];
		else
		{
			for (int i = m; i < n; i++)
			{
				int min = 0;
				for (int j = 1; j < m; j++)
				{
					if (work[j] < work[min])
						min = j;
				}
				work[min] += work[i];
			}
		}
		int res = 0;
		for (int i = 0; i < m; i++)
			res = max(work[i], res);
		return res;
	}
};

void Test_MinTime()
{
	vector<int> v = { 1,5,7,10,2,3 };
	solution s;
	/*int m;
	cout << "请输入机器个数:" << endl;*/
	cout<< s.MinTime(v, 3) <<endl;
}

 活动选择

有n个需要在同一天使用同一个教室的活动a1, a2, …, an,教室同一时刻只能由一个活动使用。每个活动a[i]都有一个开始时间s[i]和结束时间f[i]。一旦被选择后,活动a[i]就占据半开时间区间[s[i],f[i])。如果[s[i],f[i])和[s[j],f[j])互不重叠,a[i]和a[j]两个活动就可以被安排在这一天。求使得尽量多的活动能不冲突的举行的最大数量。

 这里的贪心是选择根据每个活动的结束时间来进行划分,每个活动能留给下一个活动更多的空余时间,那么最终就能求得最大参加的活动数量

 

 

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

class Com7
{
public:
	bool operator()(const vector<int>& left, const vector<int>& right)
	{
		return left[1] < right[1];
	}
};

class solution7
{
public:
	int GetMax(vector<vector<int>> arr)
	{
		sort(arr.begin(), arr.end(), Com7());
		int num = 1;
		int i = 0;
		for (int j = 1; j < arr.size(); j++)
		{
			if (arr[j][0] >= arr[i][1])
			{
				i = j;
				num++;
			}
		}
		return num;
	}
};

void Test7()
{
	solution7 s;
	vector<vector<int>> arr = { {0,6},{5,7},{8,11},{8,12},{6,10},{1,4},{3,5},{3,8},{5,9} };
	cout << s.GetMax(arr) << endl;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值