POJ 1456 Supermarket【贪心 + 并查集】
2013-04-14 12:41
483 查看
题意:给你 N 件不同的商品,每件商品最多可以买一次。
每件物品对应两个值 pi di
pi 表示物品的价值,di 表示可以买的最迟时间(也就是第一天到第 di 天都可以买这件物品)
规定:每天最多可以买一件物品,问你可以得到的最大价值。
算法:贪心
看了KB神的题解,他用的并查集,等下贴个代码。
思路【贪心版本】:将物品按照价值从大到小排序
依次枚举每件物品
从可以买的最后一天枚举,看是否可以买
注意:标记天数。
思路【KB的并查集版本】:将物品按照价值从大到小排序
处理的时候选择最后的一个不冲突点。
用并查集实现链表的作用,快速找到不冲突点。
贪心版本
并查集+贪心版本【转】 时间减少一半
每件物品对应两个值 pi di
pi 表示物品的价值,di 表示可以买的最迟时间(也就是第一天到第 di 天都可以买这件物品)
规定:每天最多可以买一件物品,问你可以得到的最大价值。
算法:贪心
看了KB神的题解,他用的并查集,等下贴个代码。
思路【贪心版本】:将物品按照价值从大到小排序
依次枚举每件物品
从可以买的最后一天枚举,看是否可以买
注意:标记天数。
思路【KB的并查集版本】:将物品按照价值从大到小排序
处理的时候选择最后的一个不冲突点。
用并查集实现链表的作用,快速找到不冲突点。
贪心版本
K | Accepted | 220 KB | 141 ms | C++ | 857 B | 2013-04-10 22:03:47 |
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 10000+10; bool used[maxn]; //标记天数是否可以买 struct Node { int pi; int di; }node[maxn]; bool cmp(Node a, Node b) { return a.pi > b.pi; //按照价值从大到小排序 } int main() { int n; while(scanf("%d", &n) != EOF) { memset(used, false, sizeof(used)); for(int i = 1; i <= n; i++) { scanf("%d%d", &node[i].pi, &node[i].di); } sort(node+1, node+n+1, cmp); int ans = 0; for(int i = 1; i <= n; i++) //枚举每一件物品 { for(int j = node[i].di; j >= 1; j--) //从后往前枚举每一天 { if(!used[j]) //一旦找到这天可以买 { ans += node[i].pi; used[j] = true; //标记这一天已经用了 break; //跳出最近的 for() 进入下一件物品 } } } printf("%d\n", ans); } return 0; }
并查集+贪心版本【转】 时间减少一半
K | Accepted | 296 KB | 79 ms | C++ | 974 B | 2013-04-14 12:40:37 |
/* POJ 1456 贪心处理。 按照获利p从大到小排序。 处理的时候选择最后的一个不冲突点。 用并查集实现链表的作用,快速找到不冲突点 */ #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; const int MAXN=10010; int F[MAXN]; struct Node { int p,d; }node[MAXN]; bool cmp(Node a,Node b)//按p从大到小排序。d没有关系 { return a.p>b.p; } int find(int x) { if(F[x]==-1)return x; return F[x]=find(F[x]); } int main() { int n; while(scanf("%d",&n)==1) { memset(F,-1,sizeof(F)); for(int i=0;i<n;i++) scanf("%d%d",&node[i].p,&node[i].d); sort(node,node+n,cmp); int ans=0; for(int i=0;i<n;i++) { int t=find(node[i].d); if(t>0) { ans+=node[i].p; F[t]=t-1; } } printf("%d\n",ans); } return 0; }
相关文章推荐
- POJ 1456 Supermarket【贪心 + 并查集】
- POJ 1456 Supermarket (贪心 + 暴力 or 优先权队列 or 并查集)
- 【经典贪心】poj 1456 Supermarket (贪心, 并查集)
- Supermarket POJ - 1456------贪心加并查集
- poj 1456 Supermarket (贪心, 并查集)
- poj 1456 Supermarket(贪心+并查集,贪心+优先队列)
- [POJ 1456]Supermarket[贪心][优先队列or并查集优化]
- POJ-1456 Supermarket 贪心 并查集优化
- POJ 1456 Supermarket(贪心 + 并查集 )
- poj 1456 - Supermarket(贪心+并查集)
- poj 1456 Supermarket 贪心 并查集优化
- POJ-1456 Supermarket【贪心+并查集】
- POJ-1456 Supermarket(贪心,并查集优化)
- POJ 1456 supermarket(贪心加并查集)
- POJ-1456 Supermarket(贪心,并查集优化)
- POJ 1456 Supermarket 区间问题并查集||贪心
- POJ---1456(Supermarket ,贪心,并查集优化,处理冲突)
- POJ 1456 Supermarket(贪心+并查集)
- POJ 1456 Supermarket (贪心+并查集)
- POJ 1456 (贪心+并查集) Supermarket