
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秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
A Guide to Node.js Logging
2019-03-04
webwxbatchgetcontact一个神奇的接口
2019-03-04
【考研英语-基础-简单句】简单句的核心变化_谓语情态
2019-03-04
实现一个简易Vue(三)Compiler
2019-03-04
仿小米商城(上)
2019-03-04
HTML 和 CSS 简单实现注册页面
2019-03-04
(SpringMVC)springMVC.xml 和 web.xml
2019-03-04
jQuery中的动画
2019-03-04
1.2.3 项目、项目集、项目组合以及运营管理之间的关系
2019-03-04
【△重点△】LeetCode - 4. 寻找两个正序数组的中位数——二分查找
2019-03-04
LeetCode - 5. 最长回文子串——字符串、动态规划
2019-03-04
全局锁和表锁 :给表加个字段怎么有这么多阻碍?
2019-03-04
二分查找与插入排序的结合使用
2019-03-04
892 三维形体的表面积(分析)
2019-03-04
279 完全平方数(bfs)
2019-03-04
875 爱吃香蕉的珂珂(二分查找)
2019-03-04
第十一届蓝桥杯python组第二场省赛-数字三角形
2019-03-04
BST中某一层的所有节点(宽度优先搜索)
2019-03-04
Dijkstra算法的总结
2019-03-04