洛谷题链

bzoj题链


PS:

  • \(t_i\) : 在什么时候建筑 \(i\) 自爆

  • \(a_i\) : 修复 \(i\) 所花时间


题解

算法:贪心+堆维护

贪心策略:

  • 直接按 \(t\) 贪心?显然不行。
  • 那我们考虑先按 \(t\) 贪心,中途再更改。
  • 按 \(t\) 从小到大排序之后,开始轮流遍历每个建筑。
  • 如果中途某个建筑 \(i\) 无法在 \(t_i\) 的时间内修复,那么在先前选择修复的建筑中拿出 \(a_j\) 最大的 \(j\) 号建筑。若 \(a_i < a_j\),则放弃 \(j\) 转而修 \(i\)。(主思路)

策略证明:

  • 若第 \(i\) 号出现时间不足,那么前 \(i\) 个建筑中最多修复 \(i-1\) 个建筑
  • 则我们必然选择 \(a_i\) 较小的前 \(i-1\) 个建筑,给后面的修复留下更多的时间

实现方法:

  • 使用堆来维护选择的建筑中 \(a_i\) 最大的。
  • 这里我用的是STL中的优先队列。
  • 至于堆和优先队列,不会的童鞋请自行学习

实际代码:

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <queue>
#define MAXN 200200
using namespace std; int n;
int T;//T指遍历时经过了多久时间
int ans;
struct node
{
int w; //这个是题解中的ai
int t;
}a[MAXN];
priority_queue<int> Q;//优先队列 bool cmp (node x, node y)
{
return x.t < y.t;//按t从小到大排序
}
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; i++)
scanf("%d%d", &a[i].w, &a[i].t);
sort(a + 1, a + n + 1, cmp);
for(int i = 1; i <= n; i++)
{
if(T + a[i].w > a[i].t)//如果无法修复此楼
{
if(a[i].w < Q.top())//ai < aj
{
T -= Q.top();//注意这里要减掉
Q.pop();
Q.push(a[i].w);
T += a[i].w;
}
}
else
{
Q.push(a[i].w);
ans++;
T += a[i].w;
}
}
printf("%d\n", ans);
return 0;
}

题解【luoguP4053 bzojP1029 [JSOI2007]建筑抢修】的更多相关文章

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

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

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

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

  3. BZOJ 1029 [JSOI2007]建筑抢修 已更新

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

  4. 1029: [JSOI2007]建筑抢修

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

  5. BZOJ 1029: [JSOI2007]建筑抢修 优先队列

    1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec  Memory Limit: 162 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...

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

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

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

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

  8. BZOJ 1029 [JSOI2007] 建筑抢修(贪心)

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

  9. BZOJ 1029: [JSOI2007]建筑抢修

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

随机推荐

  1. (python)leetcode刷题笔记04 Median of Two Sorted Arrays

    4. Median of Two Sorted Arrays There are two sorted arrays nums1 and nums2 of size m and n respectiv ...

  2. C复合文字

    C99之前,可以传递数组,但是没有所谓的数组常量可供传递,于是新增了复合文字. 普通数组声明方法: int d[2]={10,20}; 复合文字声明: 与数组名相同,常量同时代表元素的地址. (int ...

  3. php 面试题

    1.通过哪一个函数,可以把错误转换为异常处理? A:set_error_handlerB:error_reportingC:error2exceptionD:catch 正确答案:A 答案分析:set ...

  4. Ubuntu 配置 Android 开发 环境

    . 果断换Ubuntu了, Ubuntu的截图效果不好, 不能设置阴影 ... 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article ...

  5. 工具函数:cookie的添加、获取、删除

    cookie是浏览器存储的命名数据,作用是保存用户的信息,这样我们就可以用这些信息来做一些事了,但是cookie容量很小,只有4kb. 下面是我总结的cookie的添加.获取.删除的函数: cooki ...

  6. 让你的SilverLight程序部署在任意服务器上

    是的,即使是免费的只支持HTML的空间,同样可以部署SilverLight应用.众所周知,SilverLight的部署问题其实就是.xap文件名是否能被服务器支持的问题.解决的方法无非就是添加MIME ...

  7. 判断集合不为空Java

    list.size>0判断集合size是否大于0 list.isEmpty()判断集合是否为空,返回布尔值

  8. Java线程模型

    并发不一定要依赖多线程(如PHP中很常见的多进程并发),但是在Java里面谈论并发,大多数都与线程脱不开关系. 线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开, ...

  9. 如何设计好的RESTful API之安全性

    保证RESTful API的安全性,主要包括三大方面: a) 对客户端做身份认证 b) 对敏感的数据做加密,并且防止篡改 c) 身份认证之后的授权 1.对客户端做身份认证,有几种常见的做法: 1)在请 ...

  10. 第20天:京东nav、footer部分制作

    一.鼠标的4种状态 cursor:pointer; 鼠标变成小手cursor:default;小白cursor:move;移动cursor:text;文本输入 二.网页布局:1.input.butto ...