题目链接:http://poj.org/problem?id=1456

题意:有N件商品,分别给出商品的价值和销售的最后期限,只要在最后日期之前销售处,就能得到相应的利润,并且销售该商品需要1天时间。

问销售的最大利润。

这题很容易想到贪心但是贪心方向不用,复杂度也是不同的。

我第一次想到的贪心是将商品按照权值从大到小排序然后再一次安排如果当前日期已经被占用那么就向前面的日期退移。

但是这种方法很难想到优化的方法而且复杂度有点高最坏的情况因该有n*n但是数据比较水还是能过的。

第二种方法是先讲商品按照最后期限从大到小排,然后只要for一遍日期,过程中利用优先队列存入这日期之前的商品并且每次

pop一个,毕竟1天卖一个。

#include <iostream>
#include <cstring>
#include <queue>
#include <vector>
#include <cstdio>
using namespace std;
const int M = 1e4 + 10;
int n , sum;
struct line {
int val;
line(int val):val(val) {}
bool operator <(const line &a) const {
return val < a.val;
}
};
struct TnT {
int val , deadline;
}T[M];
bool cmp(TnT a , TnT b) {
return a.deadline > b.deadline;
}
void solve() {
priority_queue<line>q;
int j = 1;
for(int i = T[1].deadline ; i >= 1 ; i--) {
for( ; j <= n && T[j].deadline >= i ; j++) {
q.push(line(T[j].val));
}
if(!q.empty()) {
line gg = q.top();
q.pop(); sum += gg.val;
}
}
}
int main() {
while(scanf("%d" , &n) != EOF) {
for(int i = 1 ; i <= n ; i++) {
scanf("%d%d" , &T[i].val , &T[i].deadline);
}
sort(T + 1 , T + n + 1 , cmp);
sum = 0;
solve();
printf("%d\n" , sum);
}
return 0;
}

最新文章

  1. 索引的重载 str[&quot;name&quot;] str[i]
  2. SQL语句技巧之去除重复行
  3. Kefa and Park
  4. springmvc配置文件 spring-servlet
  5. html——基础样式篇(1)
  6. c# 通过解析mp3规范命名并上传服务器
  7. Link方式导入java项目
  8. hdu_1074_Doing Homework(状压DP)
  9. 十二个 ASP.NET Core 例子
  10. Day3 Pyhon的六大数据类型
  11. mkfs.ext4快速格式化大容量硬盘
  12. 阿里云ECS centos7配置tomcat
  13. Java RMI 概观
  14. SQL 必知必会&#183;笔记&lt;18&gt;管理事务处理
  15. java.sql.SQLException: Unsupported character encoding 'utf8mb4'.
  16. python学习——练习题(11)
  17. 用\r做出进度条
  18. Pandas对多列进行升降序排列
  19. bzoj 1968: [Ahoi2005]COMMON 约数研究【枚举】
  20. 网络爬虫之scrapy框架(CrawlSpider)

热门文章

  1. ubuntu清理系统垃圾与备份
  2. 无法正常卸载pr
  3. jmeter使用JDBC连接数据库
  4. java学习-NIO(一)简介
  5. 一文了解java异常机制
  6. 关于Java虚拟机运行时数据区域的总结
  7. 从MYSQL的ibtmp1文件太大说起
  8. .netcore持续集成测试篇之web项目验收测试
  9. 关于c++中的复合类型
  10. SpringBoot整合Dubbo配合ZooKeeper注册中心