poj_1456 贪心
题目大意
一家超市,要卖出N种物品(每种物品各一个),每种物品都有一个卖出截止日期Di(在该日期之前卖出可以获得收益,否则就无法卖出),且每种物品被卖出都有一个收益值Pi. 卖出每个物品需要耗时1天,且任一时刻只能卖出一个物品。给出这N种物品的Di和Pi,求最大收益值。
题目分析
求最优值问题,可以考虑动态规划、贪心、搜索+剪枝等算法。尝试用贪心法来分析。
题目是要卖出物品,每天只能卖出一个,最多只能卖出X个(X为所有物品中最大的deadline值)。考虑第D天,需要卖出哪个物品呢? 如果D从1到X考虑,会比较乱,因为第1天可以卖出所有N个物品(因为他们的deadline都大于等于1),此时不能直接挑选价值最大的那个进行售出(因为价值最大的那个的deadline可能会很大,第一天就将其售出可能导致其他deadline比较小的物品无法售出而造成损失。极端一点,价值最大的物品的deadline就是X,那么我们完全可以将价值最大的那个放在最后售出);而如果D从X到1考虑,则会比较容易:对于第D天,我们只能卖出deadline在D以及D之后的那些物品,可以从中选择价值最大的进行售出,因为继续考虑更小的D时,第D天可以卖出的物品仍然可以在比D小的那天卖出(而D从1到X的情形中,第D天可以卖出的物品,在第D+1天可能无法卖出),这样成了一个,在每天的可选集合中进行选择,得到最大值的问题。
日期D从X到1递减,对于每个D,都存在可以被卖出的物品的集合S(满足物品的售出截止日期大于等于D即可),从这些物品中选取出来收益最大的那个物品A,进行售出,同时将A从S中消除;D每次减1的时候,可能导致有更多的物品可以被售出,则将这些物品加入集合S,同时从S中选出最大收益的那个进行售出,并剔除集合.....
由于需要选择集合S中收益最大的那个物品,因此使用优先队列进行维护。
实现(c++)
#include<stdio.h>
#include<iostream>
#include<string>
#include<string.h>
#include<vector>
#include<stack>
#include<queue>
#include<deque>
#include<list>
#include<set>
#include<set>
#include<map>
#include<functional>
#include<algorithm>
using namespace std;
struct Node{
int profit;
int deadline;
Node(int p=0, int d=0) :profit(p), deadline(d){};
};
Node gNodes[10005];
int solve(int n){
int cur_day = gNodes[n - 1].deadline;
int cur_product = n - 1;
priority_queue<int> pq;
int result = 0;
while (cur_day && cur_product >= 0){
while (cur_product >= 0 && gNodes[cur_product].deadline >= cur_day){
pq.push(gNodes[cur_product].profit);
cur_product--;
} if (!pq.empty()){
result += pq.top();
pq.pop();
cur_day--;
}
else{
cur_day = gNodes[cur_product].deadline;
}
}
while (cur_day && !pq.empty()){
result += pq.top();
pq.pop();
cur_day--;
}
return result;
} bool cmp(const Node& node1, const Node& node2){
return node1.deadline < node2.deadline;
}
int main(){
int n;
while (scanf("%d", &n) != EOF){
for (int i = 0; i < n; i++){
scanf("%d %d", &gNodes[i].profit, &gNodes[i].deadline);
}
sort(gNodes, gNodes + n, cmp);
int result = solve(n);
printf("%d\n", result);
}
return 0;
}
poj_1456 贪心的更多相关文章
- POJ_1456 Supermarket 【并查集/贪心】
一.题面 POJ1456 二.分析 1.贪心策略:先保证从利润最大的开始判断,然后开一个标记时间是否能访问的数组,时间尽量从最大的时间开始选择,这样能够保证后面时间小的还能够卖. 2.并查集:并查集直 ...
- BZOJ 1692: [Usaco2007 Dec]队列变换 [后缀数组 贪心]
1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1383 Solved: 582[Submit][St ...
- HDOJ 1051. Wooden Sticks 贪心 结构体排序
Wooden Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- HDOJ 1009. Fat Mouse' Trade 贪心 结构体排序
FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- BZOJ 1691: [Usaco2007 Dec]挑剔的美食家 [treap 贪心]
1691: [Usaco2007 Dec]挑剔的美食家 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 786 Solved: 391[Submit][S ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【BZOJ-4245】OR-XOR 按位贪心
4245: [ONTAK2015]OR-XOR Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 486 Solved: 266[Submit][Sta ...
- code vs 1098 均分纸牌(贪心)
1098 均分纸牌 2002年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 有 N 堆纸牌 ...
- 【BZOJ1623】 [Usaco2008 Open]Cow Cars 奶牛飞车 贪心
SB贪心,一开始还想着用二分,看了眼黄学长的blog,发现自己SB了... 最小道路=已选取的奶牛/道路总数. #include <iostream> #include <cstdi ...
随机推荐
- 可变参数宏...和__VA_ARGS__
__VA_ARGS__ 是一个可变参数的宏,很少人知道这个宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持).实现思想就是宏定义中参数列表的最后一个参数为 ...
- C#操作word类文件
最近频繁操作Word文档,写了很多word的操作代码及方法,虽然已经有很多关于word的操作类了,自己还是进行了一下整合: 1.通过模板创建新文件 2.在书签处插入值 3.插入表格 4.合并单元格 5 ...
- 转 Linux调优方案,sysctl.conf的设置
$ /proc/sys/net/core/wmem_max最大socket写buffer,可参考的优化值:873200 $ /proc/sys/net/core/rmem_max最大socket读bu ...
- Understand:高效代码静态分析神器详解(一)
Understand:高效代码静态分析神器详解(一) Understand 之前用Windows系统,一直用source insight查看代码非常方便,但是年前换到mac下面,虽说很多东西都方便 ...
- FFmpeg API变化
可以查看doc目录下的APIchanges和根目录下的Changelog 去掉了ffserver程序 'avcodec_register_all' is deprecated 还有av_regis ...
- js学习笔记21----表格操作
1.获取表格元素: tHead : 表格头 tBody : 表格主体内容 tFoot : 表格尾 rows : 表格行 cells : 表格列 如获取表格第一行第一列的数据: <script ...
- 事件总线demo
经过几天的努力拜读大牛高手文章,终于对事件总线有所了解,特此记录下来,以免忘记 1.定义相关的接口: A 事件接口 public interface IDomainEvent { DateTime ...
- 在CentOS上以源码编译的方式安装Greenplum数据库
集群组成: 一台主机,一台从节点. 系统环境: 操作系统:CentOS 7,64位,7.4.1708(/etc/redhat-release中查看) CPU:AMD Fx-8300 8核 内存:8GB ...
- 帝国cms的list.var中使用php函数
$r[title] = esub($r[title],8,'...'); //截取前8个字符,多出部分用...代替 $r[title] = str_replace("lhj",&q ...
- linux -- 修改文件
vi编辑器有三种模式:命令模式,编辑模式,末行模式 打开vi后首先是命令模式,用i,o,a等进入编辑模式, 按esc退出编辑模式,回到命令模式. 在命令模式下输入:wq表示保存退出,:wq!强制保存退 ...