洛谷 P4053 [JSOI2007]建筑抢修
洛谷 P4053 [JSOI2007]建筑抢修
思路
首先题意比较容易明白:
n个建筑需要修复,只能同时修一个建筑,每个建筑修复需要t1时间,且必须在t2时间前修完,否则此建筑报废
问最多能修好多少个建筑
如果一个建筑在规定时间内没有修好的话,那它就报废了
那么为了保证能修的最多,我们首先想到的就是贪心,那么如何贪心呢?
手动模拟一下就会发现,如果从前往后修,在截止时间时这个建筑可以修好,那我们就可以修这个建筑
所以我们考虑按截止时间排序,从前往后一个个修
如果在修某个建筑i时发现修不完了,就说明在前i个建筑我们最多只能修i-1个
这时,我们就把前i个中耗时最长的那个放弃,以保证省下的时间最多
那么如何放弃最长的?显然,用优先队列维护即可
于是就有了下面这份代码
代码
/*
By:Loceaner
*/
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
inline int read() {
char c = getchar();
int x = 0, f = 1;
for( ; !isdigit(c); c = getchar()) if(c == '-') f = -1;
for( ; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + (c ^ 48);
return x * f;
}
const int N = 2e5 + 11;
struct node{
int t, r;
} d[N];
bool cmp(node a, node b) {
return a.r != b.r ? a.r < b.r : a.t < b.t;
}
int n, cnt, now;
priority_queue <int> Q;
int main() {
n = read();
for(int i = 1; i <= n; i++) d[i].t = read(), d[i].r = read();
stable_sort(d + 1, d + 1 + n, cmp);
for(int i = 1; i <= n; i++) {
if(now + d[i].t <= d[i].r) {
now += d[i].t, cnt++, Q.push(d[i].t);
continue;
}
if(Q.empty() || Q.top() <= d[i].t) continue;
now -= Q.top(),now += d[i].t;
Q.pop(), Q.push(d[i].t);
}
cout << cnt << '\n';
return 0;
}
洛谷 P4053 [JSOI2007]建筑抢修的更多相关文章
- 洛谷——P4053 [JSOI2007]建筑抢修
P4053 [JSOI2007]建筑抢修 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是T部落的基地里已经有N个建筑设施受到了严重的 ...
- 洛谷P4053 [JSOI2007]建筑抢修
放题解 题目传送门 放代码 #include <bits/stdc++.h>//万能头 #define MAXN 150000//最多的建筑数量(数据范围) using namespace ...
- P4053 [JSOI2007]建筑抢修
题目描述 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是T部落的基地里已经有N个建筑设施受到了严重的损伤,如果不尽快修复的话,这些建 ...
- Luogu P4053 [JSOI2007]建筑抢修
一道贪心题,看数据范围就知道要套一个数据结构上去. 别走啊不是什么很高级的数据结构 考虑最朴素的想法,按建筑的抢修时间排序并先拿小的 然后随便想想都可以找到一堆反例 所以我们就直接考虑模拟这个过程,按 ...
- P4053 [JSOI2007]建筑抢修 堆贪心
思路:堆贪心 提交:1次 题解: 先按时间\(sort\),然后如果能修就直接扔堆里,不能修取堆顶比一下时间长短,把时间短的扔进堆: #include<cstdio> #include&l ...
- 题解-------P4053 [JSOI2007]建筑抢修
传送门 贪心+左偏树 贪心思路:先修快炸的楼 所以我们可以按照$T2$从大到小做一遍排序,然后从$1\cdots n$一个一个去修,如果这栋楼不能修(也就是当前时间已经超过$T2_{i}$),那我们就 ...
- 【贪心】【P4053】[JSOI2007] 建筑抢修
[贪心][P4053][JSOI2007] 建筑抢修 Description 有 \(n\) 个工作,第 \(i\) 个工作做完需要 \(a_i\) 的时间,并且必须在 \(b_i\) 时刻前完成.求 ...
- [JSOI2007]建筑抢修(贪心+后悔)
[JSOI2007]建筑抢修(贪心+后悔) 洛谷题目传送门 吐槽 这是一道经典的贪心后悔的题目 做过贪心加后悔的题目的应该一眼可以看出来 解题思路 首先按倒塌时间T2排序,再从1枚举到n,能修就修,发 ...
- BZOJ1029: [JSOI2007]建筑抢修[模拟 贪心 优先队列]
1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec Memory Limit: 162 MBSubmit: 3785 Solved: 1747[Submit][Statu ...
随机推荐
- 『卧槽』意外发现了 Hashtable 的 foreach 用法 BUG
这段时间,公司项目中 遇到一个问题,最后查出: 是 Hashtable 的用法导致的. private static void AutoCleanCache() { try { lock (m_Has ...
- Linux和windows下修改tomcat内存
原文地址:https://www.cnblogs.com/wdpnodecodes/p/8036333.html 由于服务器上放的tomcat太多,造成内存溢出. 常见的内存溢出有以下两种: java ...
- RMI初体验--第一次错处理java.rmi.UnmarshalException&ClassNotFoundException
今天参考了一下网上Rhello示例,搞了一下RMI测试. server端是 java8 client 段是java6 然后 运行报错: java.rmi.UnmarshalException: err ...
- SQL Server in Docker - 还原数据库
SQL Server in Docker 还原数据库 上一会演示了如果在Docker环境下安装SQL Server,这次我们来演示下如何还原一个数据库备份文件到数据库实例上. 使用winscp上传ba ...
- vue-cli安装以及创建一个简单的项目(一)(Node\npm\webpack简单使用)
1.关系介绍 1.简单的说 Node.js 就是运行在服务端的 JavaScript. 2.NPM是随同NodeJS一起安装的包管理工具(新版的nodejs已经集成了npm),能解决NodeJS代码部 ...
- Mysql设置binlog过期时间并自动删除
问题: Mysql数据库由于业务原因,数据量增长迅速,binlog日志会增加较多,占用大部分磁盘空间. 解决方案: 出于节约空间考虑,可进行删除多余binary日志,并设置定期删除操作. .查看bin ...
- .NET使用本地Outlook邮箱指定邮箱用户名和密码发送邮件
1.添加Microsoft.Office.Interop.Outlook引用 2.封装发送邮件方法 using System; using System.Configuration; using Sy ...
- 部署 asp.net 网站到 Azure
部署asp.net网站到Azure 前言 前些天一直在写一个单页面web应用程序,终于完成了,于是考虑发布到云服务器.本人没有AWS账号,遂本打算使用谷歌云.参考文档后发现官方文档给出的方式为在vis ...
- mssql SQL Server 2008 阻止保存要求重新创建表的更改问题的设置方法
解决方法: 工具-〉选项-〉左侧有个 设计器-〉表设计器和数据库设计器 -> 阻止保存要求重新创建表的更改(右侧) 把钩去掉即可.
- maven 学习---Eclipse构建Maven项目
1. 安装m2eclipse插件 要用Eclipse构建Maven项目,我们需要先安装meeclipse插件 点击eclipse菜单栏Help->Eclipse Marketplac ...