经典的贪心题目,仅对每节课的价值由大到小排序即可,依次看每堂课的时间,若此时间未被占用,标记占用了,若已占用,则时间向前移一位,若还占用,则继续移,若移到0时刻说明此任务完成不了,累加完成不了任务的价值,得出最后结果;
post code:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[2000];
struct node{
int time,value;
}job[2000];
int cmp(node a,node b){
return a.value>b.value;
}
int main()
{
int n,i,x;
scanf("%d",&x);
while(x--){
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&job[i].time);
for(i=1;i<=n;i++){
scanf("%d",&job[i].value);
}
sort(job+1,job+1+n,cmp);
memset(a,0,sizeof(a));
int sum=0;
for(i=1;i<=n;i++){
int t=job[i].time;
while(t>0){
if(a[t]==0){ // 若未被占用标记
a[t]=1;
break;
}
else t--;
}
if(t==0)sum+=job[i].value; //到0时刻说明完成不了任务了 累计完成不了任务的价值
}
printf("%d\n",sum);
}
}

本文介绍了一种使用贪心算法解决课程安排问题的方法,通过仅对每节课的价格进行降序排序,并依次查看每堂课的时间,实现课程的最优安排。

被折叠的 条评论
为什么被折叠?



