hdu1789 Doing Homework again (贪心)
发布日期:2021-05-07 01:32:20 浏览次数:22 分类:原创文章

本文共 1015 字,大约阅读时间需要 3 分钟。

题目地址

题目大意

给出n个作业的截止时间,然后给出如果不完成第i个作业会扣多少分。每天只能做一个作业,问你最少扣多少分。

解题思路

我第一次呢是先按照截至时间从大到小排序,如果截至时间相同,就按照扣分从大到小排序。从第0天开始向后走,只要当前天小于第i个任务的截止时间,当前天加一,i+1。第三个样例就没过。
为什么呢? 比如一个任务截止时间为第一天,扣一分,另一个任务第二天,扣三分,还有一个任务也是第二天,扣两分。如果按照上面进行贪心的话,那就会扣两分。因此需要第一天完成扣三分的任务,然后完成扣两分的任务。
因此我们直接按照扣分多少进行排序,然后从当前的截至日期往前找,只要有一天是空闲的,就让它在这天完成任务,这样又能保证了它尽量不去影响截止日期在它前面的作业。

AC代码

#include <iostream>#include <algorithm>#include <cstring>using namespace std;struct node{   	int day, cost;};struct node a[1050];int vis[5000];bool cmp(struct node a, struct  node b){   	return a.cost > b.cost;}int main(){   	int t;		cin >> t;		while (t--)	{   		int n;				cin >> n;				for (int i=0; i<n; i++)			cin >> a[i].day;					for (int i=0; i<n; i++)			cin >> a[i].cost;					sort (a, a + n, cmp);		memset(vis, 0, sizeof(vis));				int num = 0;				for (int i=0; i<n; i++)		{   			int j = 0;						for (j=a[i].day; j>=1; j--)			{   				if (!vis[j])				{   					vis[j] = 1;					break;				}			}						if (j == 0)				num += a[i].cost;		}				cout << num << endl;	}		return 0;}
上一篇:属性闭包求解算法——数据库考试复习
下一篇:极小函数依赖集求解算法——数据库考试复习

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月15日 14时13分22秒