【[JSOI2007]建筑抢修】
各种瞎写
之后也不知道为什么就过了
刚看到这道题感觉确实是不会的,因为我贪心太差了\(QAQ\)
之后就随便\(yy\)呗
发现首先我们得排一下序,以\(t2\)也就是建筑的损坏时间为第一关键字从小到大排序
这个还是比较好考虑的,我们得优先照顾一下那些在最开始就会损坏的建筑
那之后呢,好像我们现在可以做一个\(dp\)了
我们设\(dp[i][j]\)表示在前\(i\)个里选择\(j\)个的最小时间是多少
这个\(dp\)的状态数就是\(n^2\)的,尽管我们可以\(O(1)\)转移,但是还是炸了
我们考虑一下贪心
我们还是按照刚才的排序来考虑
显然这样直接按照排出来的顺序扫一遍是不行的,我们得给前面的选择一个反悔的机会
于是我们开一个大根堆,用来存储之前选择的那些建筑的修筑时间
我们一旦新插入一个建筑,如果这个建筑可以被修筑,也就是\(t1_i+tot<=t2_i\),\(tot\)表示之前所选取的建筑的总时间和,那么我们就让这个建筑被修建
否则的话,我们把这个建筑和堆顶比较一下,看一看能否用这个元素取代堆顶,使得再删除堆顶的情况下这个建筑能否被选上,能的话就选上,否则就不选
至于这样为什么对呢,每一个建筑的价值都是\(1\),所以对于第二种情况来说它入堆的话就必须保证这个建筑能被选上且让这个建筑在被选上的情况下总时间最短,否则就还不如不选这个建筑
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#define LL long long
#define re register
#define maxn 150005
#define max(a,b) ((a)>(b)?(a):(b))
struct Node
{
int t1,t2;
}a[maxn];
std::priority_queue<int> q;
inline int cmp(Node K,Node M)
{
return K.t2<M.t2;
}
inline int read()
{
char c=getchar();
int x=0;
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+c-48,c=getchar();
return x;
}
int n;
int now=0,ans=0;
int main()
{
n=read();
for(re int i=1;i<=n;i++)
a[i].t1=read(),a[i].t2=read();
std::sort(a+1,a+n+1,cmp);
LL tot=0;
for(re int i=1;i<=n;i++)
{
if(tot+a[i].t1<=a[i].t2)
{
tot+=a[i].t1;
now++;
q.push(a[i].t1);
ans=max(ans,now);
}
else
{
if(a[i].t1>q.top()) continue;
if(a[i].t1+tot-q.top()<=a[i].t2)
{
tot-=q.top();
q.pop();
tot+=a[i].t1;
q.push(a[i].t1);
}
}
}
std::cout<<ans;
return 0;
}
【[JSOI2007]建筑抢修】的更多相关文章
- BZOJ1029: [JSOI2007]建筑抢修[模拟 贪心 优先队列]
1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec Memory Limit: 162 MBSubmit: 3785 Solved: 1747[Submit][Statu ...
- BZOJ 1029: [JSOI2007]建筑抢修 堆+贪心
1029: [JSOI2007]建筑抢修 Description 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是T部落的基地里已经有 ...
- BZOJ1029: [JSOI2007]建筑抢修(贪心)
题目链接:BZOJ1029: [JSOI2007]建筑抢修 题解:贪心思想,按结束时间从小到大排序,选花费时间尽量短的建筑维修,用堆维护. #include<stdio.h> #inclu ...
- BZOJ 1029 [JSOI2007] 建筑抢修(贪心)
1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec Memory Limit: 162 MBSubmit: 2285 Solved: 1004[Submit][Statu ...
- BZOJ 1029 [JSOI2007]建筑抢修 已更新
1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec Memory Limit: 162 MBSubmit: 2748 Solved: 1213[Submit][Statu ...
- BZOJ 1029: [JSOI2007]建筑抢修
1029: [JSOI2007]建筑抢修 Description 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是T部落的基地里已经有 ...
- 1029: [JSOI2007]建筑抢修
1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec Memory Limit: 162 MBSubmit: 2382 Solved: 1033[Submit][Statu ...
- BZOJ 1029: [JSOI2007]建筑抢修【优先队列+贪心策略】
1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec Memory Limit: 162 MBSubmit: 4810 Solved: 2160[Submit][Statu ...
- BZOJ_1029_ [JSOI2007]建筑抢修_贪心+堆
BZOJ_1029_ [JSOI2007]建筑抢修_贪心+堆 Description 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是 ...
- BZOJ 1029 [JSOI2007]建筑抢修 (贪心 + 优先队列)
1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec Memory Limit: 162 MBSubmit: 5452 Solved: 2422[Submit][Statu ...
随机推荐
- sql server数据库导出表里所有数据
主要步骤: 连接数据库>选择需要导出数据的数据库>任务>生成脚本 点击下一步,选择特定数据库对象>选择需要导出的数据表,下一步 选择高级>要编写脚本的数据的类型:仅限数据 ...
- 您必须先调用“WebSecurity.InitializeDatabaseConnection”方法,然后再调用"WebSecurity"类的任何其他方法。
今天调试程序的时候出现了这个是,可惜没截图! 您必须先调用“WebSecurity.InitializeDatabaseConnection”方法,然后再调用"WebSecurity&quo ...
- 撩课-Python-每天5道面试题-第2天
一. 简述编程过程中, 注释的作用? (1) 方便开发人员自己理清楚代码思路 因为开发人员在拿到一个需求时, 首先应该思考的是如何将需求问题, 分解成具体的实施步骤; 第一步干啥, 第二步干啥, 第三 ...
- HDU 2546(01背包)
http://acm.hdu.edu.cn/showproblem.php?pid=2546 http://blog.csdn.net/xujinsmile/article/details/79694 ...
- 1..net mvc的原理概述
请求过来,根据ip和端口,由iis服务器进行接收,如果是静态文件则直接返回文件内容,如果无法解析,则根据映射规则找到对应请求后缀 的ASPNET_ISAPI.dll处理程序集,交由其进行处理. 1.此 ...
- Spring的自动装配Bean
spring的自动装配功能的定义:无须在Spring配置文件中描述javaBean之间的依赖关系(如配置<property>.<constructor-arg>).IOC容器会 ...
- js比较好的一些方法
js里面有些方法比较容易忘记,但却很实用,很好用的一些方法.在此记录: 1.Math.ceil(x) — 返回大于等于数字参数的最小整数(取整函数),对数字进行上舍入 2.Math.floor(x)– ...
- [CTSC2008]祭祀(构造方案)
前面的话 这道题显然就是最长反链 根据 \(Dilworth\) 定理:最小链覆盖数 = 最长反链长度 然后传递闭包跑匹配即可 \(luogu\)交了一下,\(WA\) 了 \(QAQ\) 本来各种 ...
- 最小树形图--朱刘算法([JSOI2008]小店购物)
题面 luogu Sol 首先设一个 \(0\) 号点,向所有点连边,表示初始价值 显然这个图的一个 \(0\) 为根的最小有向生成树的边权和就是每个买一次的最小价值 再买就一定能优惠(包含 \(0\ ...
- 洛谷P3763 [TJOI2017]DNA(后缀数组 RMQ)
题意 题目链接 Sol 这题打死我也不会想到后缀数组的,应该会全程想AC自动机之类的吧 但知道这题能用后缀数组做之后应该就不是那么难了 首先把\(S\)和\(S0\)拼到一起跑,求出Height数组 ...