洛谷题链

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. Skype for Business Server 方案

    方案说明: 高可用性的配置屏蔽了单点故障,使得当一个服务器节点失效时,另外的可用的节点能够进行服务的接管.可伸缩性的配置可以保证当即时沟通平台的使用用户增加时,该平台应该具有良好的可伸缩性,能非常方便 ...

  2. Training Models

    In this page, I am going to talk about the 'hello world' model that is linear regression and train i ...

  3. 机器人控制tcp通信参数调优

    机器人使用WiFi通信,实现指令下传,状态上传.而WiFi信道平时带宽较稳定,但会在某些时候突然中断,造成ping的延时较高,但可以马上恢复.如果一直ping,则一般情况下ping值很小,但长时间(数 ...

  4. ThinkPHP - 3 - IDE选择以及Eclipse PDT打开ThinkPHP项目

    ThinkPHP框架已部署到SAE(新浪云),且代码已获取到本地.眼前面临的问题就是,对ThinkPHP项目选择哪种开发工具(IDE)? 经过简单的查找比较,以及电脑里已装有Eclipse的因素,遂决 ...

  5. Linux 添加虚拟网卡

    使用的Linux版本是Centos 7: [root@vnode33 bin]# cat /etc/redhat-release CentOS Linux release (Core) 使用ifcon ...

  6. 自测之Lesson5:标准I/O

    题目:使用perror函数和strerror函数编写一个程序. 程序代码: #include <stdio.h> #include <errno.h> #include < ...

  7. Python 元组 集合

    1. 元组 >>> a = (1,2,3,4,5) >>> b = list(a) #转换成列表对象, 可以更改 >>> b [1, 2, 3, ...

  8. JS 书籍拓展内容

    一.面向对象

  9. 【week3】四则运算 单元测试

    上一周的四则运算有bug,这次补充正确代码: // 中缀转后缀 public String[] SolveOrder(String[] in, HashMap<String, Integer&g ...

  10. mac mysql连接报错ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

    找了半天 又是kill进程,又是改设置文件,又是重启电脑,都不管用 翻到stackoverflow上的解决方案,实施成功: 原文链接:https://stackoverflow.com/questio ...