POJ-1456 Supermarket【贪心+并查集】
2017-07-12 20:22
399 查看
题目链接:http://poj.org/problem?id=1456
这里其实用贪心做,并查集只是用来作为工具,使得速度更加快。
题目大意是买卖N件东西,每件东西都有个截止时间,在截止时间之前买都可以,而每个单位时间只能买一件。问最大获利。
用并查集来做,将商品的价值从大到小排序,然后对于每个商品从截止日期开始往前推,找到一个空闲的日子,将其占用,然后将其的父节点设为前一个节点,如果不断往前查找均已经被占用,查到0天时停止,表示该商品无法购买
这里其实用贪心做,并查集只是用来作为工具,使得速度更加快。
题目大意是买卖N件东西,每件东西都有个截止时间,在截止时间之前买都可以,而每个单位时间只能买一件。问最大获利。
用并查集来做,将商品的价值从大到小排序,然后对于每个商品从截止日期开始往前推,找到一个空闲的日子,将其占用,然后将其的父节点设为前一个节点,如果不断往前查找均已经被占用,查到0天时停止,表示该商品无法购买
#include<iostream> #include<cmath> #include<cstdio> #include<iomanip> #include<cstring> #include<stdlib.h> #include<string> #include<algorithm> #include<map> #include<queue> using namespace std; #define maxn 10010 int pre[maxn]; int n; struct node { int value,time; }s[maxn]; bool cmp(node a,node b) { return a.value>b.value; } int find(int x) { int r=x; while(r!=pre[r]) r=pre[r]; int i=x,j; while(i!=r) { j=pre[i]; pre[i]=r; i=j; } return r; } int main() { while(~scanf("%d",&n)) { for(int i=0;i<n;i++) { scanf("%d%d",&s[i].value,&s[i].time); } sort(s,s+n,cmp); int sum=0; for(int i=0;i<=10000;i++)pre[i]=i; for(int i=0;i<n;i++) { int root=find(s[i].time); if(root>0) { sum+=s[i].value; pre[root]=root-1; } } printf("%d\n",sum); } return 0; }
相关文章推荐
- POJ-1456 Supermarket(贪心,并查集优化)
- POJ 1456 Supermarket(贪心+并查集)
- POJ 1456 Supermarket【贪心 + 并查集】
- POJ-1456 Supermarket(贪心,并查集优化)
- POJ 1456 Supermarket 区间问题并查集||贪心
- POJ 1456 Supermarket【贪心 + 并查集】
- Supermarket poj 1456 (贪心,并查集)
- 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 (贪心 + 暴力 or 优先权队列 or 并查集)
- poj 1456 Supermarket(贪心+并查集,贪心+优先队列)
- Supermarket POJ - 1456------贪心加并查集
- POJ-1456 Supermarket 贪心 并查集优化