工作安排 Job bzoj-1572 Usaco-2009 Open

题目大意题目链接

注释:略。


想法

  我们将任务按照截止时间排序,枚举任务的同时顺便记录出已经做了多少任务(当前时间)。

  对于当前的一个任务,如果当前的时间没有到它的截止时间,我们就做这个任务,并且扔到堆里。堆是按照权值的小根堆。如果当前的时间已经大于等于它的截止时间,我们把当前任务的权值和堆顶的权值进行比较:如果当前任务的权值比堆顶权值大,弹掉堆顶,加上两个任务的贡献差,将当前任务扔进堆里。

最后,附上丑陋的代码... ...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define N 100010
using namespace std; typedef long long ll;
struct In{ll val; bool operator < (const In &x) const {return val>x.val;}};
priority_queue<In>q;
ll ans=0; int now=0;
struct Node {ll p; int d;}a[N]; inline bool cmp(const Node &x,const Node &y) {return x.d<y.d;}
inline char nc() {static char *p1,*p2,buf[100000]; return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;}
ll rd() {ll x=0; char c=nc(); while(!isdigit(c)) c=nc(); while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=nc(); return x;}
int main()
{
int n=rd(); for(int i=1;i<=n;i++) a[i].d=rd(),a[i].p=rd(); sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)
{
if(now<a[i].d) {ans+=a[i].p; q.push((In){a[i].p}); now++;}
else if(a[i].p>q.top().val) {ans+=a[i].p-q.top().val; q.pop(); q.push((In){a[i].p});}
}
printf("%lld\n",ans);
}

小结:用堆来实现正确的贪心是一种非常常见的套路。

最新文章

  1. GJM : Unity3D HIAR 目录导航
  2. [LeetCode] Power of Four 判断4的次方数
  3. HTTP学习四:SPDY和HTTP/2.0
  4. IIS7 应用程序池设置成 经典 v2.0
  5. jQuery.bind() 函数详解
  6. iOS开发——UI篇OC篇&amp;TextField作为搜索框的使用
  7. Day01 - Python 基础介绍
  8. java.lang.NoSuchMethodError: com.google.common.collect.Maps.newConcurrentMap()Ljava/util/concurrent/Concurren‌​tMap;
  9. RHEL 7.0 修改防火墙配置
  10. Java面试题:写代码使得分别出现StackOverflowError和OutOfMemoryError
  11. Python爬虫(十七)_糗事百科案例
  12. java 关于性别的处理
  13. 爬虫之图片懒加载技术及js加密
  14. 基于STM8的GPIO操作---STM8-第一章
  15. Java程序入口:main()方法讲解
  16. redis学习笔记(二)-五种数据类型
  17. nginx做负载均衡时其中一台服务器挂掉宕机时响应速度慢的问题解决
  18. 【编译原理】c++实现词法分析器
  19. CentOS 7 install slurm cluster
  20. jpeg exif

热门文章

  1. 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 Train Seats Reservation
  2. 【LeetCode】LeetCode Weekly Contest 16B
  3. hibernate关联关系查询
  4. 93. [NOIP2001] 数的划分
  5. java 8 stream使用
  6. Windows下80端口被进程System&amp;PID=4占用的解决方法
  7. tomcat日志详释
  8. Angular——依赖注入
  9. 12Cookie、Session
  10. 我的第一个随笔——MarkDown的简单用法!