3 3 3 3 3 10 5 1 3 1 3 1 6 2 3 7 1 4 6 4 2 4 3 3 2 1 7 6 5 4
0 3 5
思路:
既然要让被扣掉的分数最少,那么必然是对分数高的作业优先安排。注意题中有一个不是很明显的条件可以支持这一点:完成每份作业都需要一天。这样就避免了优先完成一份分数高的作业而导致n(n>1)份作业没有完成,而且这n份作业分数和比一份分数高的作业还要大的情况。
方法:
对于所有的作业,按照分数从高到低排序,分数相同时,截止时间小的排在前面。另外初始化一个大小为n的数组,用来保存某一天是否已经被占用。然后开始贪心,对于每份作业,看从当天到当前之前的时间里面,有没有空余,如果有空余,安排到空余且天数最大的一天;如果没有空余,这份作业只能被扣分。注意这边天数从1开始,而代码中习惯数组从0开始,天数减1或者数组加1都可以。
参考代码:
#include<stdio.h>
#include<algorithm>
using namespace std;
struct node{
int deadline;
int score;
};
bool cmp(node a, node b){
if(a.score==b.score){
return a.deadline<b.deadline;
}
return a.score>b.score;
}
node homework[1002];
int used[1002];
int main(){
int t, n, ans;
scanf("%d", &t);
while(t--){
scanf("%d", &n);
for(int i=0;i<n;i++){
scanf("%d", &homework[i].deadline);
}
for(int i=0;i<n;i++){
scanf("%d", &homework[i].score);
}
sort(homework, homework+n, cmp);
for(int i=0;i<n;i++){
used[i] = 0;
}
ans = 0;
for(int i=0;i<n;i++){
bool flag = false;
for(int j=homework[i].deadline-1;j>=0;j--){
if(used[j]==0){
used[j] = 1;
flag = true;
break;
}
}
if(!flag){
ans += homework[i].score;
}
}
printf("%d\n", ans);
}
}原文地址:http://blog.csdn.net/podongfeng_/article/details/41526271