【bzoj4425】[Nwerc2015]Assigning Workstations分配工作站 贪心+堆

题目描述

佩内洛普是新建立的超级计算机的管理员中的一员。 她的工作是分配工作站给到这里来运行他们的计算研究任务的研究人员。

佩内洛普非常懒惰,不喜欢为到达的研究者们解锁机器。 她可以从在她的办公桌远程解锁这些机器,但她并不觉得这卑贱的任务配得上她,所以她决定忽略安全指南偷偷懒。她可以直接地要求,研究者在他们离开时不用锁定自己的工作站,然后把未在使用且还在未锁定状态的工作站分配给新来的研究人员。 这样,她只需要为每一个工作站第一次被使用所属的研究员解锁工作站,这对佩内洛普的工作来说是一个巨大的改善。

不幸的是,如果一个工作站在未锁定且没被使用的状态下超过m分钟,会自动锁定自己,佩内洛普必须为使用它的下一个研究员再次打开它。 鉴于抵达和离开的研究人员的确切时间表,你可以告诉佩内洛普,要求研究者在离开时不锁定工作站最多可以使她节约多少次的解锁工作。你可以认为这儿总是有足够的可用工作站。

输入

一行两个整数n (1≤n≤300000) 研究员的数量n,以及 m (1≤m≤100000000) 工作站在未锁定且没被使用的状态下超过m分钟会自动锁定。

下面的n行,每一行两个整数a与s (1≤a,s≤100000000) 表示一个研究员在第a分钟时到达以及待了s分钟后离开。

输出

输出研究者在离开时不锁定工作站最多可以使她节约多少次解锁工作。

样例输入

5 10
2 6
1 2
17 7
3 9
15 6

样例输出

3



题解

贪心+堆

语文题慢慢读吧。。。

读完题后发现贪心策略显然:把所有区间按照左端点从小到大排序,对于一个区间,选择结束时间最早的区间作为上一个,答案+1;如果不存在则新建一个。

拿堆维护一下即可。

时间复杂度 $O(n\log n)$

#include <queue>
#include <cstdio>
#include <cctype>
#include <algorithm>
using namespace std;
struct data
{
	int l , r;
	bool operator<(const data &a)const {return l < a.l;}
}a[300010];
priority_queue<int> q;
inline char nc()
{
	static char buf[100000] , *p1 , *p2;
	return p1 == p2 && (p2 = (p1 = buf) + fread(buf , 1 , 100000 , stdin) , p1 == p2) ? EOF : *p1 ++ ;
}
inline int read()
{
	int ret = 0; char ch = nc();
	while(!isdigit(ch)) ch = nc();
	while(isdigit(ch)) ret = ((ret + (ret << 2)) << 1) + (ch ^ ‘0‘) , ch = nc();
	return ret;
}
int main()
{
	int n = read() , m = read() , i , ans = 0;
	for(i = 1 ; i <= n ; i ++ ) a[i].l = read() , a[i].r = a[i].l + read();
	sort(a + 1 , a + n + 1);
	for(i = 1 ; i <= n ; i ++ )
	{
		while(!q.empty() && -q.top() + m < a[i].l) q.pop();
		if(!q.empty() && -q.top() <= a[i].l) ans ++ , q.pop();
		q.push(-a[i].r);
	}
	printf("%d\n" , ans);
	return 0;
}

原文地址:https://www.cnblogs.com/GXZlegend/p/8137233.html

时间: 2024-10-10 03:14:32

【bzoj4425】[Nwerc2015]Assigning Workstations分配工作站 贪心+堆的相关文章

4425: [Nwerc2015]Assigning Workstations分配工作站

4425: [Nwerc2015]Assigning Workstations分配工作站 Description Penelope is part of the admin team of the newly built supercomputer. Her job is to assign workstations to the researchers who come here to run their computations at the supercomputer. Penelope

【NWERC2015】【BZOJ4425】 AssigningWorkstations分配工作站 贪心优先队列加结构体快排

Assigning Workstations Time Limit: 20000ms, Special Time Limit:50000ms, Memory Limit:65536KB Total submit users: 7, Accepted users: 4 Problem 13604 : No special judgement Problem description Penelope is part of the admin team of the newly built super

struct对象可能分配在托管堆上吗

struct对象可能被分配在托管堆上吗? --会的. 比如当对struct装箱的时候,就会被分配在托管堆上. 比如,让一个struct实现一个接口. public interface IReport { string Name { get; } } public struct Score : IReport { public string Name { get { return "80分来自struct"; } } } 再来一个类负责打印接口属性值的类和方法. public class

【bzoj4198】[Noi2015]荷马史诗 贪心+堆

题目描述 追逐影子的人,自己就是影子. ——荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是由<奥德赛>和<伊利亚特>组成的鸿篇巨制<荷马史诗>实在是太长了,Allison 想通过一种编码方式使得它变得短一些. 一部<荷马史诗>中有 n 种不同的单词,从 1 到 n 进行编号.其中第 i 种单词出现的总次数为 wi.Allison 想要用 k 进制串 si 来替换第 i

【贪心+堆】XMU 1584 小明的烦恼

题目链接: http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1584 题目大意: 给n(n<=100 000)个任务的耗时和截至时间,问最少不能完成几个任务. 题目思路: [贪心+堆] 一开始想贪心但是没想到要加个堆,又跪了. 首先按照结束时间排序,结束时间早的肯定优先考虑. 如果当前的任务无法完成,就将当前任务和之前已经做了的任务中耗时最长的取消掉,改做当前任务 (如果当前任务就是耗时最长的则不用加当前任务,因为取消一个换另一个结果不会更差,只

java中内存分配策略及堆和栈的比较

2.1 内存分配策略 按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. 静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间.这种分配策略要求程序代码中不允许有可变数据结构(比如可变数组)的存在,也不允许有嵌套或者递归的结构出现,因为它们都会导致编译程序无法计算准确的存储空间需求. 栈式存储分配也可称为动态存储分配,是由一个类似于堆栈的运行栈来实现的.和静态存储分配相反,在栈式存储方案中,程序对数据区

Codeforces Gym100187C Very Spacious Office 贪心 堆

原文链接https://www.cnblogs.com/zhouzhendong/p/CF-Gym100187C.html 题目传送门 - CF-Gym100187C 题意 给定 $n$ 个房间以及 $n$ 个人. 第 $i$ 个房间的大小为 $a_i$. 第 $i$ 个人要的房间的大小范围为 $[L_i,R_i]$ . 现在给每一个人安排房间,一个房间只能被一个人拥有. 问是否存在方案满足条件. 如果不存在,输出:Let's search for another office. 如果存在多种方

内存分配中的堆、栈、静态区、只读区

内存中的栈区处于相对较高的地址以地址的增长方向为上的话,栈地址是向下增长的,栈中分配局部变量空间,堆区是向上增长的用于分配程序员申请的内存空间.另外还有静态区是分配静态变量,全局变量空间的:只读区是分配常量和程序代码空间的:以及其他一些分区.对于常量,在实际情况中,是会复用的,比如变量a和b都赋值为”abc”则实际上他们指向同一块地址. main.cpp int a = 0; //全局初始化区 char *p1; //全局未初始化区 main() { int b; //栈 char s[] =

数据结构中的堆和栈 与 内存分配中的堆区和栈区 分析

比較全面的总结了诸多版本号,知识无国界.感谢各位的辛勤劳作. 在计算机领域,堆栈是一个不容忽视的概念,我们编写的C/C++语言程序基本上都要用到.但对于非常多的初学着来说,堆栈是一个非常模糊的概念. (1) 数据结构的栈和堆 首先在数据结构上要知道堆栈,虽然我们这么称呼它,但实际上堆栈是两种数据结构:堆和栈. 堆和栈都是一种数据项按序排列的数据结构. 栈就像装数据的桶或箱子 我们先从大家比較熟悉的栈说起吧.它是一种具有后进先出性质的数据结构,也就是说后存放的先取.先存放的后取.这就如同我们要取出