Leopard学霸【贪心】【堆排序】

该博客介绍了如何使用贪心算法和堆排序解决在有限时间内获取最多知识的问题。给定每个课程的学习时间和知识收益,通过排序和堆数据结构找到最佳学习路径,以达到最大的知识积累。样例输入和输出展示了算法的运行情况,适用于中等规模的数据范围。解题思路包括先按截止时间排序,然后依次检查每个课程是否能安排,或者通过小根堆优化决策。
摘要由CSDN通过智能技术生成

>Description
每门功课都耗费1单位时间来学习,从0时刻开始,有1000000000个单位时间。在任意时刻,都可以任意一门功课(编号1~n)来学习。
对于第i门功课,有一个截止时间Di,若学完这门功课,就能够获得知识Pi。
在给定的功课和截止时间下,能够获得的知识最多为多少呢?


>Input
第一行,一个整数n,表示功课的数目
接下来n行,每行两个整数,Di和Pi

>Output
输出一行一个整数,表示最多学得的知识数


>Sample Input
3
2 10
1 5
1 7

>Sample Output
17

数据范围限制
10% n<=25
60% n<10000
100% 1<=n<=100000,Di、Pi<=1000000000


>解题思路
先把数据按照截止时间从小到大排个序,枚举每条数据,看看在截至时间前还有没有空着的时间给他学习这个科目,如果有,就累计进答案;如果没有,就维护一个小根堆,看看堆顶的数是不是小于当前可以获得的价值,如果当前的价值更大,就把当前的价值代替堆顶。


>代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>

using namespace std;

struct subject
{
   
	int d, p;
} a[100005];
int n, c, tt, ans, y, t[400005];

bool cmp (subject aa, subject bb) {
   return aa.d 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值