POJ 1456 Supermarket【贪心 + 并查集】
2013-04-14 12:41
633 查看
题意:给你 N 件不同的商品,每件商品最多可以买一次。
每件物品对应两个值 pi di
pi 表示物品的价值,di 表示可以买的最迟时间(也就是第一天到第 di 天都可以买这件物品)
规定:每天最多可以买一件物品,问你可以得到的最大价值。
算法:贪心
看了KB神的题解,他用的并查集,等下贴个代码。
思路【贪心版本】:将物品按照价值从大到小排序
依次枚举每件物品
从可以买的最后一天枚举,看是否可以买
注意:标记天数。
思路【KB的并查集版本】:将物品按照价值从大到小排序
处理的时候选择最后的一个不冲突点。
用并查集实现链表的作用,快速找到不冲突点。
贪心版本
#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;
}
并查集+贪心版本【转】 时间减少一半
每件物品对应两个值 pi di
pi 表示物品的价值,di 表示可以买的最迟时间(也就是第一天到第 di 天都可以买这件物品)
规定:每天最多可以买一件物品,问你可以得到的最大价值。
算法:贪心
看了KB神的题解,他用的并查集,等下贴个代码。
思路【贪心版本】:将物品按照价值从大到小排序
依次枚举每件物品
从可以买的最后一天枚举,看是否可以买
注意:标记天数。
思路【KB的并查集版本】:将物品按照价值从大到小排序
处理的时候选择最后的一个不冲突点。
用并查集实现链表的作用,快速找到不冲突点。
贪心版本
K | Accepted | 220 KB | 141 ms | C++ | 857 B | 2013-04-10 22:03:47 |
#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