Task Scheduling
Task Scheduling
| Time Limit: 1000MS | Memory Limit: 65535KB |
| Submissions: 156 | Accepted: 35 |
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; }
浙公网安备 33010602011771号