Supermarket(贪心/并查集)
原创的博客
题意:
超市里有N个商品. 第i个商品必须在保质期(第di天)之前卖掉, 若卖掉可让超市获得pi的利润。
每天只能卖一个商品。
现在你要让超市获得最大的利润。
n , p[i], d[i] 范围都在10000以内 。
- #include<iostream>
- #include<cstdio>
- #include <cctype>
- #include<algorithm>
- #include<cstring>
- #include<cmath>
- #include<string>
- #include<cmath>
- #include<set>
- #include<vector>
- #include<stack>
- #include<queue>
- #include<map>
- using namespace std;
- #define ll long long
- #define mem(a,x) memset(a,x,sizeof(a))
- #define se second
- #define fi first
- const ll mod=;
- const int INF= 0x3f3f3f3f;
- const int N=4e5+;
- int n;
- priority_queue<int>q;
- vector<int>v[N];
- int main()
- {
- while(cin>>n)
- {
- for(int i=;i<=;i++) v[i].clear() ;
- priority_queue<int>empty;
- swap(empty, q); //相当于清空q。
- for(int i=;i<=n;i++)
- {
- int x,y;
- scanf("%d%d",&x,&y);
- v[y].push_back(x);
- }
- int ans=;
- for(int i=;i>=;i--)
- {
- for(int j=;j<v[i].size();j++)
- {
- q.push(v[i][j]);
- }
- if(!q.empty())
- {
- ans+=q.top(); q.pop();
- }
- }
- printf("%d\n",ans);
- }
- }
用另一种贪心的方法来做,先把所有产品按照利润从大到小排序,然后这个把这个放在截止日期那天卖出,并做好标记,如果截至日期那天已经有其他产品占用了,那么可以把这个产品卖出的时间往前推,直到找到可以卖的那一天并标记好。 按照这种思路提交,AC了,不过却用了141 ms。
用了这个方法之后,再回想了下并查集方法的代码, 所谓的用并查集做,实际上是对上面那种方法的优化!
用并查集的关键之处是,我们知道按照上面那个方法,假设一个产品a占用了一个日期后,那么如果下次又有一个产品b和产品a的截止日期是相同的,但是那个日期以被占用了,所以就要往前移动1天,那么就可以用并查集进行标记,在a占用了那个日期后,把a的截止日期指向前一个日期,这样的话,可以直接查找到他要占用到哪一个时间。 用了并查集优化后,时间为47MS。
---------------------
作者:shuangde800
来源:CSDN
原文:https://blog.csdn.net/shuangde800/article/details/8022068
- #include<iostream>
- #include<cstdio>
- #include <cctype>
- #include<algorithm>
- #include<cstring>
- #include<cmath>
- #include<string>
- #include<cmath>
- #include<set>
- #include<vector>
- #include<stack>
- #include<queue>
- #include<map>
- using namespace std;
- #define ll long long
- #define mem(a,x) memset(a,x,sizeof(a))
- #define se second
- #define fi first
- const ll mod=;
- const int INF= 0x3f3f3f3f;
- const int N=4e5+;
- int n;
- //vector<int>v[N];
- int vis[N];
- struct node
- {
- int p,d;
- }a[N];
- bool cmp(node x,node y)
- {
- return x.p>y.p || x.p==y.p&&x.d>y.d;
- }
- int main()
- {
- while(cin>>n)
- {
- for(int i=;i<=;i++) vis[i]=;
- int maxT=;
- for(int i=;i<=n;i++)
- {
- scanf("%d%d",&a[i].p,&a[i].d);
- if(maxT<a[i].d) maxT=a[i].d;
- }
- sort(a+,a++n,cmp);
- int ans=;
- for(int i=;i<=n;i++)
- {
- if(!vis[a[i].d ])
- {
- vis[a[i].d ]=;
- ans+=a[i].p;
- }
- else{
- for(int j=a[i].d; j>=;j--)
- {
- if(!vis[j])
- {
- vis[j]=;
- ans+=a[i].p;
- break;
- }
- }
- }
- }
- cout<<ans<<endl;
- }
- }
无并查集
- #include<iostream>
- #include<cstdio>
- #include <cctype>
- #include<algorithm>
- #include<cstring>
- #include<cmath>
- #include<string>
- #include<cmath>
- #include<set>
- #include<vector>
- #include<stack>
- #include<queue>
- #include<map>
- using namespace std;
- #define ll long long
- #define mem(a,x) memset(a,x,sizeof(a))
- #define se second
- #define fi first
- const ll mod=;
- const int INF= 0x3f3f3f3f;
- const int N=4e5+;
- int n;
- int f[N];
- struct node
- {
- int p,d;
- }a[N];
- bool cmp(node x,node y)
- {
- return x.p>y.p;
- }
- int getf(int x)
- {
- if(x!=f[x])
- {
- f[x]=getf(f[x]);
- }
- return f[x];
- }
- int main()
- {
- while(cin>>n)
- {
- for(int i=;i<=;i++) f[i]=i;
- int maxT=;
- for(int i=;i<=n;i++)
- {
- scanf("%d%d",&a[i].p,&a[i].d);
- if(maxT<a[i].d) maxT=a[i].d;
- }
- sort(a+,a++n,cmp);
- int ans=;
- for(int i=;i<=n;i++)
- {
- int fa=getf(a[i].d);
- if(fa>)
- {
- ans+=a[i].p;
- f[fa]=fa-;
- }
- }
- cout<<ans<<endl;
- }
- }
+并查集
Supermarket(贪心/并查集)的更多相关文章
- poj1456 Supermarket 贪心+并查集
题目链接:http://poj.org/problem?id=1456 题意:有n个物品(0 <= n <= 10000) ,每个物品有一个价格pi和一个保质期di (1 <= pi ...
- POJ 1456 Supermarket(贪心+并查集优化)
一开始思路弄错了,刚开始想的时候误把所有截止时间为2的不一定一定要在2的时候买,而是可以在1的时候买. 举个例子: 50 2 10 1 20 2 10 1 50+20 50 2 40 ...
- POJ 1456 Supermarket(贪心+并查集)
题目链接:http://poj.org/problem?id=1456 题目大意:有n件商品,每件商品都有它的价值和截止售卖日期(超过这个日期就不能再卖了).卖一件商品消耗一个单位时间,售卖顺序是可以 ...
- POJ_1456 Supermarket 【并查集/贪心】
一.题面 POJ1456 二.分析 1.贪心策略:先保证从利润最大的开始判断,然后开一个标记时间是否能访问的数组,时间尽量从最大的时间开始选择,这样能够保证后面时间小的还能够卖. 2.并查集:并查集直 ...
- POJ1456:Supermarket(并查集+贪心)
Supermarket Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 17634 Accepted: 7920 题目链接 ...
- POJ 1456——Supermarket——————【贪心+并查集优化】
Supermarket Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit ...
- POJ 1456 (贪心+并查集) Supermarket
有n件商品,每件商品有它的利润和售出的最后期限,问能够得到的最大利润是多少 这道题和 HDU 1789 Doing Homework again 几乎一模一样,只不过这个是求最的扣分,本题是求最大利润 ...
- poj1456(贪心+并查集)
题目链接: http://poj.org/problem?id=1456 题意: 有n个商品, 已知每个商品的价格和销售截止日期, 每销售一件商品需要花费一天, 即一天只能销售一件商品, 问最多能买多 ...
- Codeforces 437D The Child and Zoo(贪心+并查集)
题目链接:Codeforces 437D The Child and Zoo 题目大意:小孩子去參观动物园,动物园分非常多个区,每一个区有若干种动物,拥有的动物种数作为该区的权值.然后有m条路,每条路 ...
随机推荐
- bootCDN引用的bootstrap前端框架套件和示例
这是bootCDN上引用的bootstrap前端框架套件,由多个框架组合而成,方便平时学习和测试使用.生产环境要仔细琢磨一下,不要用开发版,而要用生产版.bootCDN的地址是:https://www ...
- MSSQL中 float转换为varchar 变成科学计数法解决方案
在系统初始化的时候,没有在数值型的数据前面加上 单引号,导致进入数据库后都变成float型我们需要做以下转换就能将数据变为 varchar类型 declare @a float //定义一个float ...
- maven cloudara依赖下载
最近开发的项目使用到了cloudara的依赖,已经在pom.xml 中配置了cloudara的repository,但是还是无法下载 <repositories> <reposito ...
- PHP防止sql语句注入终极解决方案(包含pdo各种操作使用实例)
PHP防止sql语句注入终极解决方案完美解决方案就是使用拥有Prepared Statement机制(预处理sql)的PDO //先做个实验 先不用预处理sql写法<pre><?ph ...
- java字符串截取
import org.apache.commons.lang.StringUtils; public class substr{ public static void main(String[] ar ...
- SQL Server 中日志的的作用(Redo和Undo)
简介 之前我已经写了一个关于SQL Server日志的简单系列文章.本篇文章会进一步挖掘日志背后的一些概念,原理以及作用. 数据库的可靠性 在关系数据库系统中,我们需要数据库可靠,所谓的可靠就是当遇见 ...
- [转帖]Linux超级用户root口令忘记怎么办?
Linux超级用户root口令忘记怎么办? 2010-05-10 12:15:00 monkey_d_meng 阅读数 5535 收藏 更多 分类专栏: Linux 版权声明:本文为博主原创文章 ...
- JVM性能调优的6大步骤,及关键调优参数详解
JVM性能调优方法和步骤1.监控GC的状态2.生成堆的dump文件3.分析dump文件4.分析结果,判断是否需要优化5.调整GC类型和内存分配6.不断分析和调整JVM调优参数参考 对JVM内存的系统级 ...
- python学习-31 内置函数
内置函数 1.abs() 绝对值 2.all() 判断列表里的所有值的布尔值(如果迭代列表里的每个值后都是True 则返回True) '])) 运行结果: True Process finis ...
- Linux基础(10)AIO项目设计与POSIX文件操作和目录管理
实现fast-cp :拷贝文件到目标对象 Linux的七种文件类型 :https://blog.csdn.net/linkvivi/article/details/79834143 ls -al :h ...