点此看题面

大致题意: 有N个受到严重损伤的建筑,对于每个建筑,修好它需要\(T1\)秒,且必须在\(T2\)秒之前修完(\(T1\)与\(T2\)不是固定值),问你最多能修好几个建筑。

题解

一看到这题,就能想到一个贪心的做法。

但是,裸贪心显然是不能过的,如果加上一个堆优化,就能够水过此题。

我们可以把修好每个建筑所需的时间放入大根堆中存储。对于每一个建筑,若能在规定时间内修好,则将\(ans\)加\(1\),否则比较修好它所需的时间与堆顶元素的大小,若修好它所需的时间更少,则用其替换堆顶,此时\(ans\)不变。

代码

  1. #include<bits/stdc++.h>
  2. #define max(x,y) ((x)>(y)?(x):(y))
  3. #define min(x,y) ((x)<(y)?(x):(y))
  4. #define N 150000
  5. using namespace std;
  6. int n;
  7. struct Building
  8. {
  9. int a,t;
  10. }s[N+5];
  11. priority_queue<int> h;
  12. inline char tc()
  13. {
  14. static char ff[100000],*A=ff,*B=ff;
  15. return A==B&&(B=(A=ff)+fread(ff,1,100000,stdin),A==B)?EOF:*A++;
  16. }
  17. inline void read(int &x)
  18. {
  19. x=0;char ch;
  20. while(!isdigit(ch=tc()));
  21. while(x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
  22. }
  23. inline void write(int x)
  24. {
  25. if(x>9) write(x/10);
  26. putchar(x%10+'0');
  27. }
  28. bool cmp(Building x,Building y)
  29. {
  30. return x.t<y.t;
  31. }
  32. int main()
  33. {
  34. register int i;
  35. for(read(n),i=1;i<=n;++i) read(s[i].a),read(s[i].t);
  36. sort(s+1,s+n+1,cmp);//将每一个建筑按无法重修的时间从小到大排序
  37. int tot=0,ans=0;//tot表示当前时间
  38. for(i=1;i<=n;++i)
  39. {
  40. if(s[i].t<tot+s[i].a)//判断时间是否来得及
  41. {
  42. if(s[i].a<h.top()) tot-=h.top(),h.pop(),h.push(s[i].a),tot+=s[i].a;//如果来不及,比较其与堆顶元素的大小,若其更小,则弹出堆顶,更新当前时间,并将修好该建筑所需时间加入堆中
  43. }
  44. else h.push(s[i].a),tot+=s[i].a,++ans;//如果来得及,ans加1,并将修好该建筑所需时间加入堆中
  45. }
  46. return write(ans),0;
  47. }

【BZOJ1029】[JSOI2007] 建筑抢修(堆优化贪心)的更多相关文章

  1. bzoj1029: [JSOI2007]建筑抢修(堆+贪心)

    1029: [JSOI2007]建筑抢修 题目:传送门 题解: 一道以前就做过的水题(找个水题签个到嘛...) 很明显就是一道贪心题,这里我们用一个堆来维护 具体看代码吧,很容易YY所以不讲 代码: ...

  2. BZOJ1029: [JSOI2007]建筑抢修(贪心)

    题目链接:BZOJ1029: [JSOI2007]建筑抢修 题解:贪心思想,按结束时间从小到大排序,选花费时间尽量短的建筑维修,用堆维护. #include<stdio.h> #inclu ...

  3. BZOJ 1029: [JSOI2007]建筑抢修 堆+贪心

    1029: [JSOI2007]建筑抢修 Description 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是T部落的基地里已经有 ...

  4. BZOJ1029: [JSOI2007]建筑抢修[模拟 贪心 优先队列]

    1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec  Memory Limit: 162 MBSubmit: 3785  Solved: 1747[Submit][Statu ...

  5. BZOJ 1029: [JSOI2007]建筑抢修【优先队列+贪心策略】

    1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec  Memory Limit: 162 MBSubmit: 4810  Solved: 2160[Submit][Statu ...

  6. bzoj千题计划119:bzoj1029: [JSOI2007]建筑抢修

    http://www.lydsy.com/JudgeOnline/problem.php?id=1029 把任务按截止时间从小到大排序 如果当前时间+当前任务耗时<=当前任务截止时间,把这个任务 ...

  7. BZOJ1029:[JSOI2007]建筑抢修(贪心,堆)

    Description 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的 入侵者.但是T部落的基地里已经有N个建筑设施受到了严重的损伤,如果不尽快 ...

  8. 【贪心】【堆】bzoj1029 [JSOI2007]建筑抢修

    按完成时限排序,一个个修复.若当前建筑花费时间+之前花费的总时间不超过时限,则ans++:否则,从之前已修复的建筑中挑一个耗时最多的,与当前建筑比较,若当前建筑更优,则更新ans. #include& ...

  9. [BZOJ1029] [JSOI2007]建筑抢修(贪心 + 优先队列)

    传送门 把数据存在结构体中,至于怎么贪心? 肯定会有些想法,正确错误先不必说,先来试一试. 1.按照 t2 为第一关键字从小到大排,按照 t1 为第二关键字从小到大排 这个显然错,比如后面有个数的 t ...

  10. P4053 [JSOI2007]建筑抢修 堆贪心

    思路:堆贪心 提交:1次 题解: 先按时间\(sort\),然后如果能修就直接扔堆里,不能修取堆顶比一下时间长短,把时间短的扔进堆: #include<cstdio> #include&l ...

随机推荐

  1. vue -- 异常处理集合

    1.npm run dev 运行出错,报错如下: > webpack-dev-server --inline --progress --config build/webpack.dev.conf ...

  2. 图解linux安装hadoop

    安装步骤: 一.准备工作 1.解压文件 [root@localhost soft]# tar -zxvf hadoop-2.4.1.tar.gz 2.改名: [root@localhost soft] ...

  3. POJ1030 Rating

    题目来源:http://poj.org/problem?id=1030 题目大意:有100支队伍(编号1->100),有两场比赛.以下表的形式列出了两场比赛的名次.(有的队伍没有参赛或只参加了一 ...

  4. DHCP原理和配置

    在大型网络中,会有大量的主机和设备需要获取ip地址和网络参数,为了解决手动配置的工作量大.ip冲突问题,因此需要使用DHCP(dynamic host configuration protocol). ...

  5. 学霸笔记系列 - Python Selenium项目实战(一)—— 怎么去验证一个按钮是启用的(可点击)?

    Q: 使用 Python Selenium WebDriver 怎么去验证一个按钮是启用的(可点击)? A:Selenium WebDriver API 里面给出了解决方法is_enabled() 使 ...

  6. div可编辑 可拖动

    版权声明:本文为博主原创文章,未经博主允许不得转载. 1.可编辑: <div id="move" contentEditable="true">可编 ...

  7. Unity www动态加载网上图片

    一. 1.新建一个UGUI的Button,删掉它的Image组件,添加一个Raw Image组件.如图: 由于删除了Image组件,所以画圈的位置是空的,运行后会自动把Raw Image添加到那里. ...

  8. lazy load的一些网址

    http://www.gayadesign.com/scripts/queryLoader/ http://www.oschina.net/p/queryloader http://www.cnblo ...

  9. PHP笔试题和面试题

    1.不用新变量直接交换现有两个变量的值 (1)list($a,$b)=array($b,$a); (2)a=a+b,b=a-b,a=a-b 2.PHP数字金额转大小格式,同时说明思路 function ...

  10. C++中的引用和指针

    引用和指针有何区别?何时只能使用指针而不能使用引用?    引用是一个别名,不能为 NULL 值,不能被重新分配:指针是一个存放地址的变量.当需要对变量重新赋以另外的地址或赋值为 NULL 时只能使用 ...