带时限的作业排序问题----经典问题

【题目描述】
设有一个单机系统、无其它资源限制且每个作业运行相等时间,不妨假定每个作业运行1个单位时间。现有n(0<n<1000)个作业,每个作业都有一个截止期限di>0,di为整数。如果作业能够在截止期限之内完成,可获得pi>0的收益。问题要求得到一种作业调度方案,该方案给出作业的一个子集和该作业子集的一种排列,使得若按照这种排列次序调度作业运行,该子集中的每个作业都能如期完成,并且能够获得最大收益。
【输入】
第一行输入n的值,以下n行输入作业号i,收益pi,截止期限di。
【输出】
n个作业的一个最优子集。
【输入样例】
4
1 100 2
2 10 1
3 15 2
4 27 1
【输出样例】
1 4

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 20;
struct Work{
	int index;
	int d;
	int p;
};
bool cmp(Work x,Work y){
	return x.p>y.p;
}
int JS(Work *work,int *x,int n){
	int k = 0;
	x[0]=0;
	for(int j = 1 ; j < n ;j++){
		int r = k;
		while(r>=0 && work[x[r]].d>work[j].d && work[x[r]].d>r+1)
			r--;
		if((r<0 || work[x[r]].d<=work[j].d) && work[j].d>r+1){
			for(int i = k ; i >= r+1;i--)
				x[i+1]=x[i];
			x[r+1]=j;
			k++;
		} 
	}
	return k;
}
int main(){
	int n,x[N]; 
	Work *work= new Work [N];
	cin>>n;
	for(int i = 0 ; i < n ; i++){
		cin>>work[i].index>>work[i].p>>work[i].d;	
	}
	sort(work,work+n,cmp);
	int k = JS(work,x,n);
	int num[N];
	for(int i = 0 ; i <= k ; i++){
		num[i]=work[x[i]].index;
	}
	sort(num,num+k+1);
	for(int i = 0 ; i <=k;i++)cout<<num[i]<<' ';
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值