题目链接

原创的博客

题意:

  超市里有N个商品. 第i个商品必须在保质期(第di天)之前卖掉, 若卖掉可让超市获得pi的利润。

  每天只能卖一个商品。

  现在你要让超市获得最大的利润。

  n , p[i], d[i] 范围都在10000以内 。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include <cctype>
  4. #include<algorithm>
  5. #include<cstring>
  6. #include<cmath>
  7. #include<string>
  8. #include<cmath>
  9. #include<set>
  10. #include<vector>
  11. #include<stack>
  12. #include<queue>
  13. #include<map>
  14. using namespace std;
  15. #define ll long long
  16. #define mem(a,x) memset(a,x,sizeof(a))
  17. #define se second
  18. #define fi first
  19. const ll mod=;
  20. const int INF= 0x3f3f3f3f;
  21. const int N=4e5+;
  22.  
  23. int n;
  24.  
  25. priority_queue<int>q;
  26. vector<int>v[N];
  27.  
  28. int main()
  29. {
  30. while(cin>>n)
  31. {
  32. for(int i=;i<=;i++) v[i].clear() ;
  33. priority_queue<int>empty;
  34. swap(empty, q); //相当于清空q。
  35.  
  36. for(int i=;i<=n;i++)
  37. {
  38. int x,y;
  39. scanf("%d%d",&x,&y);
  40. v[y].push_back(x);
  41. }
  42.  
  43. int ans=;
  44. for(int i=;i>=;i--)
  45. {
  46. for(int j=;j<v[i].size();j++)
  47. {
  48. q.push(v[i][j]);
  49. }
  50. if(!q.empty())
  51. {
  52. ans+=q.top(); q.pop();
  53. }
  54. }
  55. printf("%d\n",ans);
  56. }
  57. }

  用另一种贪心的方法来做,先把所有产品按照利润从大到小排序,然后这个把这个放在截止日期那天卖出,并做好标记,如果截至日期那天已经有其他产品占用了,那么可以把这个产品卖出的时间往前推,直到找到可以卖的那一天并标记好。 按照这种思路提交,AC了,不过却用了141 ms。

  用了这个方法之后,再回想了下并查集方法的代码, 所谓的用并查集做,实际上是对上面那种方法的优化!
用并查集的关键之处是,我们知道按照上面那个方法,假设一个产品a占用了一个日期后,那么如果下次又有一个产品b和产品a的截止日期是相同的,但是那个日期以被占用了,所以就要往前移动1天,那么就可以用并查集进行标记,在a占用了那个日期后,把a的截止日期指向前一个日期,这样的话,可以直接查找到他要占用到哪一个时间。  用了并查集优化后,时间为47MS。

---------------------
作者:shuangde800
来源:CSDN
原文:https://blog.csdn.net/shuangde800/article/details/8022068

  1. #include<iostream>
  2. #include<cstdio>
  3. #include <cctype>
  4. #include<algorithm>
  5. #include<cstring>
  6. #include<cmath>
  7. #include<string>
  8. #include<cmath>
  9. #include<set>
  10. #include<vector>
  11. #include<stack>
  12. #include<queue>
  13. #include<map>
  14. using namespace std;
  15. #define ll long long
  16. #define mem(a,x) memset(a,x,sizeof(a))
  17. #define se second
  18. #define fi first
  19. const ll mod=;
  20. const int INF= 0x3f3f3f3f;
  21. const int N=4e5+;
  22.  
  23. int n;
  24.  
  25. //vector<int>v[N];
  26. int vis[N];
  27. struct node
  28. {
  29. int p,d;
  30. }a[N];
  31. bool cmp(node x,node y)
  32. {
  33. return x.p>y.p || x.p==y.p&&x.d>y.d;
  34. }
  35.  
  36. int main()
  37. {
  38. while(cin>>n)
  39. {
  40. for(int i=;i<=;i++) vis[i]=;
  41. int maxT=;
  42. for(int i=;i<=n;i++)
  43. {
  44. scanf("%d%d",&a[i].p,&a[i].d);
  45. if(maxT<a[i].d) maxT=a[i].d;
  46. }
  47. sort(a+,a++n,cmp);
  48. int ans=;
  49. for(int i=;i<=n;i++)
  50. {
  51. if(!vis[a[i].d ])
  52. {
  53. vis[a[i].d ]=;
  54. ans+=a[i].p;
  55. }
  56. else{
  57. for(int j=a[i].d; j>=;j--)
  58. {
  59. if(!vis[j])
  60. {
  61. vis[j]=;
  62. ans+=a[i].p;
  63. break;
  64. }
  65. }
  66. }
  67. }
  68. cout<<ans<<endl;
  69. }
  70. }

无并查集

  1. #include<iostream>
  2. #include<cstdio>
  3. #include <cctype>
  4. #include<algorithm>
  5. #include<cstring>
  6. #include<cmath>
  7. #include<string>
  8. #include<cmath>
  9. #include<set>
  10. #include<vector>
  11. #include<stack>
  12. #include<queue>
  13. #include<map>
  14. using namespace std;
  15. #define ll long long
  16. #define mem(a,x) memset(a,x,sizeof(a))
  17. #define se second
  18. #define fi first
  19. const ll mod=;
  20. const int INF= 0x3f3f3f3f;
  21. const int N=4e5+;
  22.  
  23. int n;
  24. int f[N];
  25.  
  26. struct node
  27. {
  28. int p,d;
  29. }a[N];
  30. bool cmp(node x,node y)
  31. {
  32. return x.p>y.p;
  33. }
  34.  
  35. int getf(int x)
  36. {
  37. if(x!=f[x])
  38. {
  39. f[x]=getf(f[x]);
  40. }
  41. return f[x];
  42. }
  43. int main()
  44. {
  45. while(cin>>n)
  46. {
  47. for(int i=;i<=;i++) f[i]=i;
  48.  
  49. int maxT=;
  50. for(int i=;i<=n;i++)
  51. {
  52. scanf("%d%d",&a[i].p,&a[i].d);
  53. if(maxT<a[i].d) maxT=a[i].d;
  54. }
  55. sort(a+,a++n,cmp);
  56. int ans=;
  57. for(int i=;i<=n;i++)
  58. {
  59. int fa=getf(a[i].d);
  60. if(fa>)
  61. {
  62. ans+=a[i].p;
  63. f[fa]=fa-;
  64. }
  65. }
  66. cout<<ans<<endl;
  67. }
  68. }

+并查集

Supermarket(贪心/并查集)的更多相关文章

  1. poj1456 Supermarket 贪心+并查集

    题目链接:http://poj.org/problem?id=1456 题意:有n个物品(0 <= n <= 10000) ,每个物品有一个价格pi和一个保质期di (1 <= pi ...

  2. POJ 1456 Supermarket(贪心+并查集优化)

    一开始思路弄错了,刚开始想的时候误把所有截止时间为2的不一定一定要在2的时候买,而是可以在1的时候买. 举个例子: 50 2  10 1   20 2   10 1    50+20 50 2  40 ...

  3. POJ 1456 Supermarket(贪心+并查集)

    题目链接:http://poj.org/problem?id=1456 题目大意:有n件商品,每件商品都有它的价值和截止售卖日期(超过这个日期就不能再卖了).卖一件商品消耗一个单位时间,售卖顺序是可以 ...

  4. POJ_1456 Supermarket 【并查集/贪心】

    一.题面 POJ1456 二.分析 1.贪心策略:先保证从利润最大的开始判断,然后开一个标记时间是否能访问的数组,时间尽量从最大的时间开始选择,这样能够保证后面时间小的还能够卖. 2.并查集:并查集直 ...

  5. POJ1456:Supermarket(并查集+贪心)

    Supermarket Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 17634   Accepted: 7920 题目链接 ...

  6. POJ 1456——Supermarket——————【贪心+并查集优化】

    Supermarket Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit  ...

  7. POJ 1456 (贪心+并查集) Supermarket

    有n件商品,每件商品有它的利润和售出的最后期限,问能够得到的最大利润是多少 这道题和 HDU 1789 Doing Homework again 几乎一模一样,只不过这个是求最的扣分,本题是求最大利润 ...

  8. poj1456(贪心+并查集)

    题目链接: http://poj.org/problem?id=1456 题意: 有n个商品, 已知每个商品的价格和销售截止日期, 每销售一件商品需要花费一天, 即一天只能销售一件商品, 问最多能买多 ...

  9. Codeforces 437D The Child and Zoo(贪心+并查集)

    题目链接:Codeforces 437D The Child and Zoo 题目大意:小孩子去參观动物园,动物园分非常多个区,每一个区有若干种动物,拥有的动物种数作为该区的权值.然后有m条路,每条路 ...

随机推荐

  1. bootCDN引用的bootstrap前端框架套件和示例

    这是bootCDN上引用的bootstrap前端框架套件,由多个框架组合而成,方便平时学习和测试使用.生产环境要仔细琢磨一下,不要用开发版,而要用生产版.bootCDN的地址是:https://www ...

  2. MSSQL中 float转换为varchar 变成科学计数法解决方案

    在系统初始化的时候,没有在数值型的数据前面加上 单引号,导致进入数据库后都变成float型我们需要做以下转换就能将数据变为 varchar类型 declare @a float //定义一个float ...

  3. maven cloudara依赖下载

    最近开发的项目使用到了cloudara的依赖,已经在pom.xml 中配置了cloudara的repository,但是还是无法下载 <repositories> <reposito ...

  4. PHP防止sql语句注入终极解决方案(包含pdo各种操作使用实例)

    PHP防止sql语句注入终极解决方案完美解决方案就是使用拥有Prepared Statement机制(预处理sql)的PDO //先做个实验 先不用预处理sql写法<pre><?ph ...

  5. java字符串截取

    import org.apache.commons.lang.StringUtils; public class substr{ public static void main(String[] ar ...

  6. SQL Server 中日志的的作用(Redo和Undo)

    简介 之前我已经写了一个关于SQL Server日志的简单系列文章.本篇文章会进一步挖掘日志背后的一些概念,原理以及作用. 数据库的可靠性 在关系数据库系统中,我们需要数据库可靠,所谓的可靠就是当遇见 ...

  7. [转帖]Linux超级用户root口令忘记怎么办?

    Linux超级用户root口令忘记怎么办? 2010-05-10 12:15:00 monkey_d_meng 阅读数 5535  收藏 更多 分类专栏: Linux   版权声明:本文为博主原创文章 ...

  8. JVM性能调优的6大步骤,及关键调优参数详解

    JVM性能调优方法和步骤1.监控GC的状态2.生成堆的dump文件3.分析dump文件4.分析结果,判断是否需要优化5.调整GC类型和内存分配6.不断分析和调整JVM调优参数参考 对JVM内存的系统级 ...

  9. python学习-31 内置函数

    内置函数 1.abs()  绝对值 2.all()    判断列表里的所有值的布尔值(如果迭代列表里的每个值后都是True 则返回True) '])) 运行结果: True Process finis ...

  10. Linux基础(10)AIO项目设计与POSIX文件操作和目录管理

    实现fast-cp :拷贝文件到目标对象 Linux的七种文件类型 :https://blog.csdn.net/linkvivi/article/details/79834143 ls -al :h ...