sdut1763-任务调度

Problem Description
一个单位时间任务是恰好需要一个单位时间完成的任务。给定一个单位时间任务的有限集S。关于S的一个时间表用于描述S中单位时间任务的执行次序。时间表中第1个任务从时间0 开始执行直至时间1 结束,第2 个任务从时间1 开始执行至时间2 结束,…,第n个任务从时间n-1 开始执行直至时间n结束。
具有截止时间和误时惩罚的单位时间任务时间表问题可描述如下。
(1) n个单位时间任务的集合S={1,2,…,n};
(2) 任务i的截止时间di ,1≤i≤n,1≤ di ≤n,即要求任务i在时间di 之前结束;
(3) 任务i的误时惩罚wi ,1≤i≤n,即任务i未在时间di 之前结束将招致wi 的惩罚;若按时完成则无惩罚。
任务时间表问题要求确定S的一个时间表(最优时间表)使得总误时惩罚达到最小。
给定n 个单位时间任务,各任务的截止时间di ,各任务的误时惩罚wi ,1≤i≤n,计算最优时间表。

Input
输入数据的第一行是正整数n(n≤1000),表示任务数。接下来的2行中,每行有n个正整数,分别表示各任务的截止时间和误时惩罚。

Output
将计算出的最小总误时惩罚输出。

Example Input
7
4 2 4 3 1 4 6
70 60 50 40 30 20 10

Example Output
50

思路:起初我的想法就是依据惩罚值排序,但是后来写着写着发现并没有得到想要的结果,然后就弃之了,又想到用递归来做,遍历一下所有情况,结果写的乱七八糟,后来看了看别人的想法,也算是明白了,先对惩罚值排序,然后再惩罚值高的一个一个试着插入固定时间内,如果差不进去就记下来惩罚值,最后这个惩罚值就是最小的。

代码:

 int change = 0;//flag
    int cost = 0;//要求的结果
    for (i = 0;i < all;i++)//all总数
    {
        for (j = taskOne[i].task-1; j >= 0;j--)//task为任务要求时间,优先考虑放在后面,给后面的时间要求小的留空间 
        {
            if (flag[j] == 0)
            {
                flag[j] = 1;
                change = 1;
                break;
            }
        }
        if (change == 0)
        {
            cost = cost + taskOne[i].fir;//fir为任务的惩罚值
        }
        change = 0;
    }

——————————2018.2.13注—————————————–
这里加一些注解,首先是上述的排序,是按照惩罚值降序排列,再者flag数组的初始值为0。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值