任务调度和最小生成树

调度问题:

问题背景:一个共享资源,多个job要访问。
question:那我们应该如何排列job的顺序
假定:每个job 有优先级 ,和需要使用资源的时间长度当我们排列所有job之后,每个job都会有一个开始时间和结束时间,那么如何评定一个方案是不是好方案 ,/[ c_{i} /] 指的是任务最后完成时间
/[ \min \left( \sum_{i=1}^{n}c_{i}w_{i}\right)  /]
ok 那么,我们的算法就需要解决上述问题:贪心
#include<string>
#include<iostream>
#include<fstream>
#include <map>
#include <queue>
//#include <deque>
using namespace std;

ifstream fin("jobs.txt");

struct Job{
	int w;
	int l;

	bool operator < (const Job & n)const {

		if( (w - l) == (n.w - n.l) ) return w > n.w;
		return (w - l) > (n.w - n.l);

		//return (w *1.0/ l) > (n.w *1.0/ n.l);

	}
};

const int N = 10000 + 10;
struct Job data[N];
int  input()
{
	int n;
	fin >>n ;

	for(int i = 1 ; i <= n ; i ++){
		fin>>data[i].w >>data[i].l;
	}
	return n;

}
void jobs1()
{
	int n = input();
	sort(data+ 1 ,data + n + 1);
	long long sum = 0;
	int l  = 0;
	for(int i = 1 ; i <= n ; i ++){
		l += data[i].l ;
		sum += l * data[i].w;
	}

	cout << sum << endl;
}
2: 最小生成树
证明:
引入割的定义:
G=<V,E> ,V是G的顶点集,那么割是对(S,V-S)的一个划分,当一条边e(u,v),其中一个端点属于S,另一个属于V-S。那么这条边是割的边。
cut 对于最小生成树的帮助是,如果某条边是cut(S,V-S)中最小的,那么这条边一定是属于最小生成树里面的。
如果某割是两个子图之间权值最小的边,那么他一定在最小生成树里面。
for(int i = 1 ; i < n ; i ++){
	int mindist = 0x33fffff;
	// get min
	for(int j = 1 ; j <= n ; j ++){
		if(used[j] == 0){
			if(dist[j] < mindist){
				mindist = dist[j];
				pos = j;
			}
		}
	}//end for
	ans  += mindist;
	used[pos] = 1;

	for(int j = 1 ; j <= n ; j ++){
		if(used[j] == 0){
			if(dist[j] >  mat[pos][j])
				dist[j] =  mat[pos][j];
		}
	}
}


原始博客地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值