题目链接:http://poj.org/problem?id=1456

题目大意:

有N件商品,分别给出商品的价值和销售的最后期限,只要在最后日期之前销售处,就能得到相应的利润,并且销售该商品需要1天时间。

问销售的最大利润。

 

我开始的代码:(贪心策略有问题,因为我当时以为过期时间短的商品要优先卖掉,实际上不是这样的)

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. #define MAXN 10000+100
  6.  
  7. struct node
  8. {
  9. int val;
  10. int day;
  11. };
  12.  
  13. bool mysort(node a, node b) //按照天数从小到大排序,若天数相同,就按价格从大到小排序
  14. {
  15. if (a.day != b.day)return a.day < b.day;
  16. return a.val > b.val;
  17. }
  18.  
  19. int main()
  20. {
  21. int n;
  22. while (scanf("%d", &n) != EOF)
  23. {
  24. int i, j; int sum = ;
  25. node dday[MAXN];
  26. dday[].day = ; dday[].val = ;
  27. for (int i = ; i <=n; i++)
  28. {
  29. scanf("%d%d", &dday[i].val, &dday[i].day);
  30. }
  31. sort(dday+, dday + n+,mysort); //注意这里我是从i=1,开始存数据的,所排序的时候也要从i=1开始排序
  32. int ans = ;
  33. for (i = ; i <= n; i++)
  34. {
  35. if (dday[i].day != dday[i - ].day)
  36. {
  37. ans += dday[i].day - dday[i - ].day-; //dday[i-1]到dday[i]之间空闲的天数,可以存起来,留给后面时间冲突的天数使用
  38. sum += dday[i].val;
  39. }
  40. else
  41. {
  42. if (ans>)
  43. {
  44. ans--; //若之前有空余的天数,那么可以拿一天留到现在来销售
  45. sum += dday[i].val;
  46. }
  47. }
  48. }
  49. printf("%d\n", sum);
  50. }
  51. return ;
  52. }

虽然能过样例,但是还有一些情况没有想到。比如,不一定要过期时间越早的商品越先销售,因为,如果后面有价值更大的商品由于时间的冲突不能卖出的话,完全可以舍弃之前销售价值最小的商品,来卖这件价值更大的商品。

比如数据 :

5 1 3 15 2 5 3 20 2 10 1

正确答案为 40 而我的代码答案为35

然后换另一种贪心思想:

将商品的价值从大到小排序,找到销售的最大期限,用visit数组标记,如果它的期限没有被占用,就在该天销售,如果占用,则从它的前一天开始向前查找有没有空闲的日期,如果有则占用。这样就可以得到最大销售量。

  1.  
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. #define N 10010
  7. bool visit[N];
  8.  
  9. struct node
  10. {
  11. int profit, deadline;
  12. }p[N];
  13.  
  14. bool operator <(node a, node b)
  15. {
  16. return a.profit > b.profit;
  17. }
  18.  
  19. int main()
  20. {
  21. int num;
  22. int maxprofit;
  23. while (~scanf("%d", &num))
  24. {
  25. maxprofit = 0;
  26. memset(visit, false, sizeof(visit));
  27. for (int i = 1; i <= num; ++i)
  28. {
  29. scanf("%d %d", &p[i].profit, &p[i].deadline);
  30. }
  31. sort(p + 1, p + num + 1); //注意这里是从p+1开始排序
  32. for (int i = 1; i <= num; ++i) //优先价值最大
  33. {
  34. if (!visit[p[i].deadline])
  35. {
  36. maxprofit += p[i].profit;
  37. visit[p[i].deadline] = true;
  38. }
  39. else
  40. {
  41. for (int j = p[i].deadline - 1; j >= 1; --j)
  42. {
  43. if (!visit[j])
  44. {
  45. maxprofit += p[i].profit;
  46. visit[j] = true;
  47. break;
  48. }
  49. }
  50. }
  51. }
  52. printf("%d\n", maxprofit);
  53. }
  54. return 0;
  55. }
  1.  

并查集做法,原理与上面差不多

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. #define N 10010
  7. int pre[N];
  8.  
  9. struct node
  10. {
  11. int profit, deadline;
  12. }p[N];
  13.  
  14. bool operator < (const node& a, const node& b)
  15. {
  16. return a.profit > b.profit;
  17. }
  18.  
  19. int find(int x) //寻找该点的根节点
  20. {
  21. int root, temp;
  22. root = x;
  23. while (root != pre[root])
  24. root = pre[root];
  25. while (x != root) //压缩路径
  26. {
  27. temp = pre[x];
  28. pre[temp] = root;
  29. x = temp;
  30. }
  31. return root;
  32. }
  33.  
  34. int main()
  35. {
  36. int num;
  37. int root;
  38. int maxprofit;
  39. while (~scanf("%d", &num))
  40. {
  41. maxprofit = ;
  42. for (int i = ; i < N; ++i) //注意这里i小于的是N,不是num
  43. pre[i] = i;
  44. for (int i = ; i < num; ++i)
  45. scanf("%d%d", &p[i].profit, &p[i].deadline);
  46. sort(p, p + num);
  47. for (int i = ; i < num; ++i)
  48. {
  49. root = find(p[i].deadline);
  50. if (root > )
  51. {
  52. pre[root] = root - ;
  53. maxprofit += p[i].profit;
  54. }
  55. }
  56. printf("%d\n", maxprofit);
  57. }
  58. return ;
  59. }
  1.  

2018-04-21 

POJ-1456 Supermarket 销售商品【贪心】+【并查集】的更多相关文章

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

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

  2. POJ 1456 Supermarket 区间问题并查集||贪心

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

  3. poj 1456 Supermarket - 并查集 - 贪心

    题目传送门 传送点I 传送点II 题目大意 有$n$个商品可以销售.每个商品销售会获得一个利润,但也有一个时间限制.每个商品需要1天的时间销售,一天也只能销售一件商品.问最大获利. 考虑将出售每个物品 ...

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

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

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

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

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

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

  7. POJ - 1456 贪心+并查集

    做法一:直接贪心,按照利润排序,然后直接尽量给每个活动安排到最晚的时间即可.时间复杂度O(n * d)当d都为10000时,很容易超时.由于这题数据比较水,所有贪心未超时. AC代码 #include ...

  8. poj 1456 Supermarket(并查集维护区间)

     题意:有一些货物,每一个货物有价值和卖出的截至日期,每天能够卖一个货物,问能卖出的最大价值是多少. 思路:算法不难想到,按价值降序排列.对于每一件货物,从deadline那天開始考虑.假设哪天空 ...

  9. poj1456 Supermarket 贪心+并查集

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

随机推荐

  1. 什么是 maven的uber-jar

    在maven的一些文档中我们会发现 "uber-jar"这个术语,许多人看到后感到困惑.其实在很多编程语言中会把super叫做uber (因为suber可能是关键字), 这是上世纪 ...

  2. 关于GTID模式下备份时 --set-gtid-purged=OFF 参数的实验【转】

    刚刚听了吴老师是复制章节课程,对于GTID模式下备份数据--set-gtid-purged=OFF 参数有些不理解,于是乎做了实验,加深理解,得出些结论,如有错漏请批评指正! 部分备份: [root@ ...

  3. 安装installshield问题

    install designer中 general information 选择setup languages shortcuts编辑  开始  中显示目录 文件路径 C:\Program Files ...

  4. 使用Navicat Premium对sqlserver 2008进行表、字段及用户权限的精细化管理

    在一些特殊的业务场景,我们需要对数据库进行精细化的管理,比如只能授权给某用户某个表的操作权限,最小权限法则可以保障数据库最大的安全.利用navicat这个轻量化的工具可以很轻松的解决这个问题 1.通过 ...

  5. sqlserver数据库系统性能监控步骤

    1.部署好环境JDK+tomcat+数据库 ①修改数据库连接账号密码db.properties ②修改applicationContext.xml文件,开启任务 <bean id="o ...

  6. 京东在html5页面中打开本地app的解决方案

    转:https://blog.csdn.net/CameloHuang/article/details/64476385 从html5打开本地的app–如果本地没有app就跳转到下载页面,大家都会认为 ...

  7. mysql多线程插入速度与不同数据库之间的比较

    package ThreadInsetMysql;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQ ...

  8. poj2828 伸展树模拟

    用伸展树模拟插队比线段树快乐3倍.. 但是pojT了.别的oj可以过,直接贴代码. 每次更新时,找到第pos个人,splay到根,然后作为新root的左子树即可 #include<iostrea ...

  9. Fiddler抓包7-post请求(json)

    前言上一篇讲过get请求的参数都在url里,post的请求相对于get请求多了个body部分,本篇就详细讲解下body部分参数的几种形式. 一.body数据类型 常见的post提交数据类型有四种: 1 ...

  10. python接口自动化测试九:重定向相关

    allow_redirects=False  不重定向 # 获取重定向后的地址 loc = r.headers # 相对地址 host = 'https://i.cnblogs.com/' url = ...