BZOJ 1029 JSOI2007 建筑抢修 贪心+堆
题目大意:n个建筑须要抢修。第i个建筑须要T1时间抢修。必须在T2时间之前抢修完成。求最多能抢修多少建筑
首先我们对T2排序 然后依次修理 可是这样贪心显然是不对的 比方说这组数据:
5
10 10
10 20
2 21
2 21
2 21
贪心仅仅能修理前两个。而实际上最多能够修理4个
于是我们考虑修正贪心算法
比方说这组数据,当我们枚举到3的时候。尽管已经无法修理很多其它了,可是我们能够取消修理建筑1而改修理3。这样尽管不能更新ans 可是能够为后面的建筑节省时间
所以做法就非常明白了
我们维护一个大根堆 每修理一栋建筑 我们就把这栋建筑的T1值增加堆 若当前无法修理 我们推断堆顶是否比这栋建筑的T1大 假设大 取消修理堆顶。改为修理当前建筑
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 150100
using namespace std;
struct construction{
int T1,T2;
bool operator < (const construction &x) const
{
return T2 < x.T2;
}
}buildings[M];
int n,ans,now,heap[M],top;
void Insert(int x)
{
heap[++top]=x;
int t=top;
while(t>1&&heap[t]>heap[t>>1])
swap(heap[t],heap[t>>1]),t>>=1;
}
void Pop()
{
heap[1]=heap[top--];
int t=2;
while(t<=top)
{
if(t<top&&heap[t+1]>heap[t])
++t;
if(heap[t]>heap[t>>1])
swap(heap[t],heap[t>>1]),t<<=1;
else
break;
}
}
int main()
{
int i;
cin>>n;
for(i=1;i<=n;i++)
scanf("%d%d",&buildings[i].T1,&buildings[i].T2);
sort(buildings+1,buildings+n+1);
for(i=1;i<=n;i++)
{
if(now+buildings[i].T1<=buildings[i].T2)
{
now+=buildings[i].T1;
++ans;
Insert(buildings[i].T1);
}
else
{
if(!top)
continue;
int temp=heap[1];
if( temp>buildings[i].T1 )
now=now+buildings[i].T1-temp,Pop(),Insert(buildings[i].T1);
}
}
cout<<ans<<endl;
}
BZOJ 1029 JSOI2007 建筑抢修 贪心+堆的更多相关文章
- BZOJ 1029 [JSOI2007]建筑抢修 (贪心 + 优先队列)
1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec Memory Limit: 162 MBSubmit: 5452 Solved: 2422[Submit][Statu ...
- BZOJ 1029: [JSOI2007]建筑抢修 贪心
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1029 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落 ...
- bzoj 1029 [JSOI2007]建筑抢修——贪心(伪dp)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1029 当然要按结束时间排序,然后按顺序修或跳过.就是那种“……不会使答案不优”的证明. 想了 ...
- BZOJ 1029: [JSOI2007]建筑抢修 堆+贪心
1029: [JSOI2007]建筑抢修 Description 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是T部落的基地里已经有 ...
- 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: 4810 Solved: 2160[Submit][Statu ...
- BZOJ 1029: [JSOI2007]建筑抢修
1029: [JSOI2007]建筑抢修 Description 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是T部落的基地里已经有 ...
- BZOJ 1029 [JSOI2007]建筑抢修 已更新
1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec Memory Limit: 162 MBSubmit: 2748 Solved: 1213[Submit][Statu ...
- BZOJ 1029: [JSOI2007]建筑抢修 优先队列
1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec Memory Limit: 162 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...
随机推荐
- docker入门——构建镜像
前面我们已经介绍了如何拉取已经构建好的带有定制内容的Docker镜像,那么如何构建自己的镜像呢? 构建Docker镜像有以下两种方法: 使用docker commit命令. 使用docker buil ...
- com.esotericsoftware.kryo.kryoexception java.util.ConcurentModificationException
近期 有网友看我的"整合Kafka到Spark Streaming--代码演示样例和挑战"文章, 讲 kafka对象 放到 pool 并通过broadcast广播出去: 然后 在开 ...
- JAVA中MD5加密实现
MD5加密实现 结 package com.pb; import java.io.UnsupportedEncodingException; import java.security.Message ...
- netsh学习
show allowedprogram –显示被允许的程序配置 show config - 显示防火墙的配置 show currentprofile -显示 Windows 防火墙的当前配置文件. s ...
- 触发器学习笔记(:new,:old用法)
触发器学习笔记(:new,:old用法) 触发器是数据库发生某个操作时自动运行的一类的程序 用于保持数据的完整性或记录数据库操作信息方面 触发器不能够被直接调用,只能够 ...
- vscode简洁的代码编辑器
微软去年tuichu的代码编辑神器,vscode很不辞哦,感受还不错.微软也破天荒地跨平台地支持... 支持多种语言 vscode(官方):code.visualstudio.com vscode中文 ...
- Win7命令行下查看无线网络信息
查看本机记录的wifi热点 C:\Users\Milton>netsh wlan show profiles Profiles on interface Wireless Network Con ...
- xargs详解
一.场景 这个命令是错误的 find ./ -perm +700 |ls -l 这样才是正确的 find ./ -perm +700 |xargs ls -l 二.用法 [root@localhos ...
- 【转载】@RequestMapping的分类
@RequestMapping的分类 类级别的和方法级别的@RequestMapping的几种形式: @RequestMapping(method = RequestMethod.GET) @Req ...
- 看似无参却有参-----JS中的函数传参
事件event JS的事件event是一个非常大的对象,不管是什么事件,事件的详情都会绑定到全局变量event中.这样做之所以安全,就是因为JS是单线程的. <html> <body ...