hdu1789Doing Homework again【贪心算法】

#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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值