任务调度问题
作者:互联网
题目描述
一个单位时间任务是恰好需要一个单位时间完成的任务。给定一个单位时间任务的有限集S。关于S 的一个时间表用于描述S 中单位时间任务的执行次序。时间表中第1 个任务从时间0 开始执行直至时间1 结束,第2 个任务从时间1 开始执行至时间2 结束,…,第n个任务从时间n-1 开始执行直至时间n结束。具有截止时间和误时惩罚的单位时间任务时间表问题可描述如下:
(1) n 个单位时间任务的集合S={1,2,…,n}(n≤500);
(2) 任务i的截止时间d[i],1≤i≤n,1≤d[i]≤n,即要求任务i在时间d[i]之前结束;
(3) 任务i 的误时惩罚1≤w[i]< 1000,1≤i≤n,即任务i 未在时间d[i]之前结束将招致w[i]的惩罚;若按时完成则无惩罚。
任务时间表问题要求确定S 的一个时间表(最优时间表)使得总误时惩罚达到最小。输入数据
第一行是正整数 n, 表示任务数。接下来的 2 行中,每行有 n 个正整数,分别表示各任务的截止时间和误时惩罚。
输出数据
将计算出的最小总误时惩罚输出
样例输入
7 4 2 4 3 1 4 6 70 60 50 40 30 20 10
样例输出
50
解析:
贪心策略:按时完成惩罚较大的任务,当有冲突时,尽量提前完成惩罚较大的任务,若最终不能完成,则只能接受惩罚。
这里,先将任务按照惩罚从大到小排序;然后,用时间数组,先将任务从前往后,按照截止时间安排;
若有冲突,则往前安排;若最终不能被安排,则这个任务接受惩罚。
完整代码:
#include<iostream> #include<algorithm> using namespace std; struct Task{ int d; int w; }t[505]; int time[505]; bool cmp(Task a, Task b){ return a.w > b.w; } int main(){ int n; cin>>n; for(int i=1; i<=n; i++) cin>>t[i].d; for(int i=1; i<=n; i++) cin>>t[i].w; sort(t+1, t+n+1, cmp); int ans=0; for(int i=1; i<=n; i++){ if(time[t[i].d]==0){//按照截止时间安排 time[t[i].d]=1; //cout<<t[i].d<<endl; } else{//有冲突 int flag=0; for(int j=t[i].d-1; j>=1; j--){ //将该任务往截止时间之前安排 if(time[j]==0){ flag=1; time[j]=1; break; } } if(flag==0) //最终没能安排成功,接受惩罚 ans += t[i].w; } } cout<<ans<<endl; return 0; }
标签:惩罚,int,时间表,问题,任务,时间,误时,任务调度 来源: https://blog.csdn.net/zhuibushixi/article/details/109922945