洛谷题链

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程序设计——函数设计与调用

    一.函数定义与调用 def 函数名([参数列表]): '''注释''' 函数体 # 输出小于n的斐波那契数 >>def fib(n): a,b=1,1 while a < n: pr ...

  2. Linux系统负载查询

    查询Linux系统负载情况,一般需要了解三个方面的信息: 1.Linux系统配置.如Linux版本号.CPU.内存.网络.磁盘等: 2.收集系统负载信息的手段.常用的工具包有sysstat和procp ...

  3. python常用命令—查看模块所在位置

    环境:ipython3 交互式解释器 语法: import 模块名 模块名.__file__ 功能: 查看模块的所在位置 例:

  4. HDU 3268/POJ 3835 Columbus’s bargain(最短路径+暴力枚举)(2009 Asia Ningbo Regional)

    Description On the evening of 3 August 1492, Christopher Columbus departed from Palos de la Frontera ...

  5. [zt]手把手教你写对拍程序(PASCAL)

    谁适合看这篇文章? ACMERS,OIERS或其它参加算法竞赛或需要算法的人 对操作系统并不太熟悉的人 不会写对拍的人 在网上找不到一个特别详细的对拍样例的人 不嫌弃我写的太低幼的人 前言 在NOIP ...

  6. lintcode-191-乘积最大子序列

    191-乘积最大子序列 找出一个序列中乘积最大的连续子序列(至少包含一个数). 样例 比如, 序列 [2,3,-2,4] 中乘积最大的子序列为 [2,3] ,其乘积为6. 标签 子数组 领英 动态规划 ...

  7. 我们在删除SQL Sever某个数据库表中数据的时候,希望ID重新从1开始,而不是紧跟着最后一个ID开始需要的命令

    一.如果数据重要,请先备份数据 二.删除表中数据 SQL: Delete From ('表名')  如:Delete From abcd 三.执行新语句 SQL: dbcc checkident('表 ...

  8. 在a标签的href用户#name 的可以实现页面 上下跳转

  9. 同步锁(synchronized)使用三要素

    1.代码被多个线程访问 2.代码中有共享的数据 3.共享数据被多个语句操作

  10. vscode Variables Reference

    vscode Variables Reference 您可以在以下链接中找到该列表:https://code.visualstudio.com/docs/editor/variables-refere ...