洛谷 P2107 小Z的AK计划

题目描述

在小 Z 的家乡,有机房一条街,街上有很多机房。每个机房里都有一万个人在切题。小 Z 刚刷完 CodeChef,准备出来逛逛。

机房一条街有 n 个机房,第 i 个机房的坐标为 xi​ ,小 Z 的家坐标为 0。小 Z 在街上移动的速度为 1,即从 x1​ 到 x2​ 所耗费的时间为 ∣x1​−x2​∣。

每个机房的学生数量不同,ACM 题目水平也良莠不齐。小 Z 到达第 i 个机房后,可以花 ti​ 的时间想题,然后瞬间 AK;当然,也可以过机房而不入。

小 Z 现在只有 m 个单位时间,之后他就该赶着去打 Codeforces 了。现在他想知道自己最多能在多少个机房 AK,希望你帮帮他。

输入格式

第一行包含两个整数 n,m。

接下来 n 行,每行包含两个整数 xi​,ti​。

输出格式

第一行包含一个整数,表示小 Z 最多能 AK 的机房数量。

输入输出样例

输入 #1复制

2 10
1 100
5 5

输出 #1复制

1

说明/提示

对于 30 的数据,n≤20。

对于 60% 的数据,n≤1000。

对于 100% 的数据,1≤n≤10^{5},0≤m,xi​≤10^{18},0≤ti​≤10^{9}

思路:

这是一道典型的反悔贪心的题目。

我们将走到这个机房的时间和做题需要的时间加在一起,当总时间超过将队首所用的时间从花的总时间中减去,将队首出队。

代码如下:

#include
using namespace std;
priority_queue ,less > q; //可以自动排序的队列
struct f{
	long long a,b;
}f1[100005];
bool g(f a, f b){
	return a.a>n>>m;
	for(int i=1;i<=n;i++){
		cin>>f1[i].a>>f1[i].b;
	}
	sort(f1+1,f1+n+1,g);
	long long c=0;
	for(int i=1;i<=n;i++){
		c+=f1[i].a-f1[i-1].a+f1[i].b;
		sum++;
		q.push(f1[i].b);//将数据入队
		while(q.size()>0&&c>m){
			sum--;
			c-=q.top();
			q.pop();//将所花时间最多的队首出队
		}
		if(c>m){
			break;
		}
		ans=max(ans,sum);
	}
	cout<

你可能感兴趣的:(算法,c++,贪心算法)