贪心法带时薪的作业排序问题

设有⼀个单机系统、⽆其它资源限制且每个作业运⾏相等时间,假定每个作业运⾏1个单位时间。现有n(0<n<1000)个作业,每个作业都有⼀个截⽌期限di>0,di为整数,1<=i<=n。如果作业能够在截⽌期限之内完成,可获得pi>0的收益。问题要求得到⼀种作业调度⽅案,该⽅案给出作业的⼀个⼦集和该作业⼦集的⼀种排列,使得若按照这种排列次序调度作业运⾏,该⼦集中的每个作业都能如期完成,并且能够获得最⼤收益。

输入

第⼀⾏⼀个正整数,表⽰n的值;以下n⾏,每⾏三个整数,分别表⽰作业号i,收益pi,截⽌期限di。

输出

第一行:n个作业的一个最优子集

第二行:最大收益

样例输入 Copy

<span style="color:#333333"><span style="background-color:#ffffff"><span style="background-color:#ffffff"><span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#f5f5f5">4
1 100 2
2 10 1
3 15 2
4 27 1</span></span></span></span></span></span>

样例输出 Copy

<span style="color:#333333"><span style="background-color:#ffffff"><span style="background-color:#ffffff"><span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#f5f5f5">1 4
127</span></span></span></span></span></span>

#include<stdio.h>
typedef struct work{
    int ii,p,dd;
}ws;
void Sort(ws *obs,int n)
{
    for(int i=n-1;i>0;i--){
        for(int j=0;j<i;j++){
            if(obs[j].p<obs[j+1].p){
                ws temp;
                temp=obs[j];
                obs[j]=obs[j+1];
                obs[j+1]=temp;
            }
        }
    }

}
void Sort2(ws *obs,int n)
{
    for(int i=n-1;i>0;i--){
        for(int j=0;j<i;j++){
            if(obs[j].ii>obs[j+1].ii){
                ws temp;
                temp=obs[j];
                obs[j]=obs[j+1];
                obs[j+1]=temp;
            }
        }
    }

}
void Sort1(int *obs,int n)
{
    for(int i=n-1;i>0;i--){
        for(int j=0;j<i;j++){
            if(obs[j]>obs[j+1]){
                int temp;
                temp=obs[j];
                obs[j]=obs[j+1];
                obs[j+1]=temp;
            }
        }
    }

}
int main(){
    int x;int k=0;
    ws w[100],a[100],b[100]={0};
    int c[100]={0};
    int s[100];int sum=0;
    scanf("%d",&x);
    for(int i=0;i<x;i++){
        scanf("%d %d %d",&w[i].ii,&w[i].p,&w[i].dd);

    }
    Sort(w,x);
//printf("%d",c[y]);
    for(int i=0;i<x;i++){
    int y=w[i].dd;
    if(c[y]==0){
        c[y]=y;    s[k]=y;k++;
    }
    }//printf("%d",k);
    Sort1(s,k);
    for(int i=0;i<k;i++){
       for(int j=0;j<x;j++){
           if(w[j].dd==s[i]){
               b[i]=w[j];break;
           }
       }
    }
    Sort2(b,k);
    for(int i=0;i<k;i++){
        printf("%d ",b[i].ii);
        sum=sum+b[i].p;
    }
    printf("\n");
    printf("%d",sum);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值