POJ 1456【贪心+并查集路径压缩】

【第二次周赛B题(POJ 1456)】

 

【原题链接】

http://acm-hit.sunner.cn/index.php?option=com_wrapper&Itemid=39

 

http://acm.pku.edu.cn/JudgeOnline/problem?id=1456

 

http://acm.jlu.edu.cn/joj/showproblem.php?pid=1966

 

【题目大意】

输入若干件商品的销售截止日期和能获得的利润,且没件商品销售一天即可销售完,计算可获得的最大利润。

【解题思想】

贪心算法,每次将利润最大的商品找到没有销售商品的最晚的时间销售,最后得到最大利润。由于找最晚时间时候遍历比较浪费时间,所以做了优化,认为每天前面最晚能销售的日期为该天的根节点,如果根节点是自己表示该天就可以销售,每次输入时找到根节点,且将路径中的节点压缩路径,这样就可以节省很多遍历时间。

 

[code]

#include <iostream>

#include <cstdio>

#include <algorithm>

using namespace std;

 

struct product

{ long p,d; }pr[11000];     //商品数组

 

long f[11000]; //父节点数组

 

int cmp(product a, product b)

{ return a.p>b.p; }

 

long findIn(long day)

{

         long tmpDay;

         tmpDay=day;

         while(f[tmpDay]!=tmpDay) tmpDay=f[tmpDay];    //找到day的根节点为tmpDay

         while(f[day]!=day)

         {

                   day=f[day];

                   f[day]=tmpDay;        //压缩路径,将路径中所有点的父节点赋值为其根节点

         }

         return tmpDay;        //返回根节点

}

 

int main()

{

         long n,i,maxDay,ans,day;

         while(scanf("%ld",&n)!=EOF)

         {

                   maxDay=0;

                   for(i=0;i<n;i++)

                   {

                            scanf("%ld%ld",&pr[i].p,&pr[i].d);

                            if(pr[i].d>maxDay) maxDay=pr[i].d;         //找到可以销售最晚的日期

                   }

                   for(i=0;i<=maxDay;i++) f[i]=i; //初始化,每天的根节点为自己

                   sort(pr,pr+n,cmp);   //按照利润从大到小排序

                   ans=0;

                   for(i=0;i<n;i++)

                   {

                            day=findIn(pr[i].d); //找到该节点的根节点

                            if(day)       //如果找到的不是0,说明此商品可以销售

                            {

f[day]=day-1;   //那么该天已经有商品销售,不能再销售新商品,父节点(不//一定是根节点,根节点有寻找和路径压缩的过程)成为前//一天。

                                     ans+=pr[i].p;    //加上该商品可以获得的利润

                            }

                   }

                   printf("%ld\n",ans);                   //输出最大能获得的利润

         }

         return 0;

}

[\code]

posted on   liugoodness  阅读(633)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述

导航

< 2010年3月 >
28 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 1 2 3
4 5 6 7 8 9 10

统计

点击右上角即可分享
微信分享提示