小埋公司的IPO方案的题解

目录

原题描述:

题目描述

输入格式

输出格式

输出格式

样例 #1

样例输入 #1

样例输出 #1

样例 #2

样例输入 #2

样例输出 #2

提示

题目大意:

主要思路:

但是but

代码code:


时间限制: 500ms

空间限制: 65536kB

原题描述:

题目描述

小埋创建的公司即将开始IPO。为了更高的将价格将股票卖给风险投资公司,小埋希望在 IPO 之前公司开展一些项目增加自己的公司资本。由于资源有限,它只能在 IPO 之前完成最多 K 个不同的项目。请帮助小埋设计完成最多 K 个不同的项目后得到的最大总资本的方式。

小埋有这样 n 个项目。对于每个项目 i ,它都有一个纯利润 A_i ,和启动该项目需要的最小资本 B_i

最初,小埋的资本为 w。当你完成一个项目时,你将获得纯利润,且利润将被添加到你的总资本当中。

总而言之,从这 n 个项目当中选择最多 K 个不同的项目列表,以最大化最终的资本,并输出最终可获得的最多的资本。

输入格式

第一行输入一个整数 n,w,k

以下 n 行有 n 个项目,每一行有两个值 A_i,B_i​,A_i的值是投资获取的利润,B_i的值是启动该项目的最小资本。

输出格式

输出一个整数,输出最大化后的资本。

输出格式

输出一个整数,输出最大化后的资本。

样例 #1

样例输入 #1

3 0 2
1 0
2 1
3 1 

样例输出 #1

4

样例 #2

样例输入 #2

3 0 3 
1 0 
2 1
3 2

样例输出 #2

6

提示

1 \le n \le 10^5

0 \le w \le 10^9

1 \le k \le 10^5

0 \le A_i \le 10^4

0 \le B_i \le 10^9

题目大意:

这个好理解,就是和解锁关卡一样,你最多可以解锁k个,解锁第i个关卡需要B_i的经验值(解锁不消耗经验值,也就是不用-B_i)如果你解锁了第i个关卡,你会获得A_i的经验值,你初始有x的经验值,有n个关卡。

主要思路:

很明显,这题就是贪心,每次找到比w小的项目,把这个项目获得的钱放进优先队列中(如果有了就不放),找到获得钱数最大的(q.top)然后弹出队首,w+=q.top()。

但是but

可是这样做还是会超时,因为每次找比w小的项目要花n的复杂度,所以会超时。

这个时候。。。

双指针闪亮登场。

我们可以先按照需要的钱从小到大的排个序,由于每次w会再增大,所以可以用pos记入到哪了,每次从pos开始找,复杂度就会小很多。

代码code:

#include
using namespace std;
int n,w,k;
priority_queue q;
pair p[100010];
int main()
{
	cin>>n>>w>>k;
	for(int i=1;i<=n;i++)
	{
		cin>>p[i].second>>p[i].first;//反着存,方便sort
	}
	sort(p+1,p+1+n);
	int p1=1;
	int cnt=0;
	while(k--)
	{
		while(p1<=n&&p[p1].first<=w)//双指针
		{
			q.push(p[p1].second);
			p1++;
		}
		if(q.empty())//如果空了,就跳出。
		{
			break;
		}
		w+=q.top();
		q.pop();//加上,pop()
//		w-=tmp;
		
//		cnt+=tmp;
	}
	cout<

你可能感兴趣的:(题解,算法,c++,题解,贪心算法,priority_queue,优先队列,双指针算法)