题解 P1478 【陶陶摘苹果(升级版)】

看着你们累死累活得快排、冒泡、结构体特殊冒泡、还有dp...
蒟蒻表示真的不用那么麻烦!


难度:新手村+1
压行情况:0
理解难度:0
首先我们来了解一下优先队列:(自己抄的自己...)
讲元素一个个放进队列里,自动维护(排序),然后抽出来,堆排序过程!
原先的堆排序是要开一个数组来着...


那么我们的思路也很简单:摘最省力气的苹果,然后减啊减,就这个样子...
Code(c++):

#include <iostream>
#include <queue>//优先队列
#include <cstdio>
using namespace std;
priority_queue<int,vector<int>,greater<int> >qwq;
//小根堆,从小到大排序
int main()
{
	int n,s,a,b,h,f,count=0;
	scanf("%d%d%d%d",&n,&s,&a,&b);
	b=a+b;//这是陶陶最大的高度
	for (int i=1;i<=n;i++)
	{
		scanf("%d%d",&h,&f);
		if (h>b||f>s)
		{//如果陶陶没力气摘或者够不着就放弃数据
			continue;
		}
		else
		{如果摘得着就把它的力气值塞进堆里
			qwq.push(f);
		}
	}
	while (s>0&&s>=qwq.top())
    //保证下一个数据能使用,有力气摘
	{//能摘的话就count++,然后把力气值减掉
		s=s-qwq.top();
		count++;
		qwq.pop();
	}
	printf("%d",count);//然后把计数器输出来
	return 0;
}

蒟蒻求过,毕竟秒杀冒泡。。。

原文地址:https://www.cnblogs.com/jelly123/p/10385947.html