Task Scheduling

Task Scheduling

 

Time Limit:   1000MS       Memory Limit:   65535KB
Submissions:   156       Accepted:   35

 

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 的一个时间表(最优时间表)使得总误时惩罚达到最小。

 

Input

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

 

Output

最小总误时惩罚。

 

Sample Input

 

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

 

Sample Output

 

50

 

解析:

大致题意:每个任务对应一个单位时间,但都有个截止时间和误时惩罚,求出最小总误时惩罚

大致思路:有两个关键点:①排序http://www.cnblogs.com/jiangjun/articles/2515346.html,首先如果罚时多,当然尽量先完成,其次如果罚时一样,肯定选截止时间靠前的。有想法的人肯定就会问如果出现如下情况,4(70) 3(60) 2(50) 1(40),那按排序就出问题了。这里说明一下,这道题肯定没这么简单,也不是完全按排序来选择,排序只是为关键点②作铺垫,实质在②上;②有了排序,最坏的情况也得在截止时间之前完成嘛,否则就罚时了。那么就用个数组记录,如果这个截止时间被占用,那就往前找空位;如果找不到,那就只得罚时了。这里大家就应该知道排序的作用了吧,具体过程见如下代码:

 

# include<stdio.h>
# include<string.h>
# include<algorithm>
using namespace std;
struct node
{
    int t;
    int pun;
}time[1005];
int cmp(const void *a,const void *b)
{
    struct node *c=(node *)a;
    struct node *d=(node *)b;
    if(c->pun!=d->pun)return d->pun-c->pun;
    else return c->t-d->t;
}
int main()
{
    int n;
    int i,cnt,sum=0;
    int vis[1005];
    scanf("%d",&n);
    memset(vis,0,sizeof(vis));
    for(i=0;i<n;i++)
        scanf("%d",&time[i].t);
    for(i=0;i<n;i++)
        scanf("%d",&time[i].pun);
    qsort(time,n,sizeof(time[0]),cmp);//重要排序
    for(i=0;i<n;i++)
    {
        if(!vis[time[i].t])
        {
            vis[time[i].t]=1;
        }
        else                          //如果被占,就往前找空位
        {
            cnt=time[i].t;
            while(vis[cnt]&&cnt)
            {
                cnt--;
            }
            if(cnt==0)                //没找到空位就只得罚时了
            sum+=time[i].pun;
            else vis[cnt]=1;
        }
    }
    printf("%d\n",sum);
    return 0;
}

 

 

 

posted on 2013-03-06 09:19  即为将军  阅读(572)  评论(0)    收藏  举报

导航