#include <iostream>
#include <algorithm>
using namespace std;
//题意:有一组作业,每个作业都有自己的最后期限和分数,只要改作业在自己的最后期限之前完成都可以拿分,
//每一种作业只要一天就可以完成了,求最后被罚掉的分数。
//思路:1、每一种作业要按照分数大小排序从大到小排序,分数相同的按照最后期限从小到大排序
// 2、排序后的作业,对于第i种作业只要在自己的最后期限内可以完成,尽可能的往后拖,这样可以让后面的作业尽可能多的完成。
// 但是第i种作业必须完成,因为第i种作业的分值比后面的作业的分值大,扣了多可惜啊
// 3、所以我们设定一个数组flag[],flag[i] = 0, 表示第i天没有任务做,
// flag[i] =1 表示某一个作业在第i天完成,当然i必然小于该作业的最后期限;
// 这样如果某个作业在其最后期限之前没有发现那一天没有任务,那么这个作业只能被扣分了
#define NSIZ 1010
typedef struct Node_
{
int dline;
int score;
}Node;
Node node[NSIZ];
int flag[NSIZ];
int cmp(Node a, Node b)
{
if(a.score == b.score)
{
return a.dline < b.dline;
}
return a.score > b.score;
}
int main()
{
int t, i, j,n;
int sum;
int complete;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
for(i = 0;i < n; ++i)
{
scanf("%d", &node[i].dline);
}
for(i = 0;i <n; ++i)
{
scanf("%d", &node[i].score);
}
sort(node, node + n, cmp);
memset(flag, 0, sizeof(flag));
sum = 0;
for(i = 0;i < n;++i)
{
for(j = node[i].dline - 1; j >= 0; --j)
{
if(flag[j] == 0)
{
flag[j] = 1;
break;
}
}
if(j == -1)
{
sum += node[i].score;
}
}
printf("%d\n", sum);
}
return 0;
}
hdu1789Doing Homework again【贪心算法】
最新推荐文章于 2021-11-09 17:36:15 发布