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