POJ 1456 Supermarket(贪心+并查集优化)
一开始思路弄错了,刚开始想的时候误把所有截止时间为2的不一定一定要在2的时候买,而是可以在1的时候买。
举个例子:
50 2 10 1 20 2 10 1 50+20
50 2 40 4 30 4 20 1 10 1 20+50+30+40
思路:用优先级队列,每次取价格最大的(如果价格相同,取截止时间最大的)。
然后往1~maxdx里加,首先看它截止时间上的位置是否已经存在其他物品,如果不存在,就加到该处。
如果存在,就往前判断,直到有一处空位没被占用,就加入到该位置。
后来网上看了一下,可以用并查集查找不冲突的时间点
不用并查集优化,110ms;用并查集后,63ms
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
const int maxn=; int n;
int vis[maxn]; //若vis[i]=1,表示此处已经有物品,即有物品在i时刻卖出
int maxdx=; //用于记录所有物品中最大的截止时间
int f[maxn];
struct Product{
int price,deadtime; bool operator <(const Product tmp) const{
if(price==tmp.price)
return deadtime<tmp.deadtime;
else
return price<tmp.price;
}
}; void init(){
for(int i=;i<=maxdx;i++){
f[i]=i;
}
}
int find_root(int x){
if(f[x]!=x)
f[x]=find_root(f[x]);
return f[x];
}
int main()
{ int p,d;
int ans,counts;
Product tmp;
while(scanf("%d",&n)!=EOF){
priority_queue<Product> q;
maxdx=;
memset(vis,,sizeof(vis));
for(int i=;i<=n;i++){
scanf("%d%d",&p,&d);
if(d>maxdx)
maxdx=d;
tmp.price=p;
tmp.deadtime=d;
q.push(tmp); }
init();
ans=;
counts=; //用于记录所卖的物品个数,如果个数为maxdx,表明1~maxdx中的所有时刻都已有物品在卖
while(counts<maxdx && !q.empty()){
tmp=q.top();
q.pop();
if(vis[tmp.deadtime]==){
ans+=tmp.price;
vis[tmp.deadtime]=;
f[tmp.deadtime]=tmp.deadtime-; //刚开始这里忘写了,导致WA
counts++;
}
else{
int t=tmp.deadtime;
int pos=find_root(t);
if(pos>){
vis[pos]=;
counts++;
ans+=tmp.price;
f[pos]=pos-;
}
/*
while(vis[t]==1){
t--;
}
if(t>0){
vis[t]=1;
ans+=tmp.price;
counts++;
}
*/
} }
printf("%d\n",ans);
}
return ;
}
POJ 1456 Supermarket(贪心+并查集优化)的更多相关文章
- POJ 1456——Supermarket——————【贪心+并查集优化】
Supermarket Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit ...
- Supermarket---poj456(贪心并查集优化)
题目链接:http://poj.org/problem?id=1456 题意是现有n个物品,每个物品有一个保质期和一个利润,现在每天只能卖一个商品,问最大的利润是多少,商品如果过期了就不能卖了: 暴力 ...
- poj1456 Supermarket 贪心+并查集
题目链接:http://poj.org/problem?id=1456 题意:有n个物品(0 <= n <= 10000) ,每个物品有一个价格pi和一个保质期di (1 <= pi ...
- POJ 1456 - Supermarket - [贪心+小顶堆]
题目链接:http://poj.org/problem?id=1456 Time Limit: 2000MS Memory Limit: 65536K Description A supermarke ...
- nyoj 208 + poj 1456 Supermarket (贪心)
Supermarket 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 A supermarket has a set Prod of products on sal ...
- POJ 1456 Supermarket(贪心+并查集)
题目链接:http://poj.org/problem?id=1456 题目大意:有n件商品,每件商品都有它的价值和截止售卖日期(超过这个日期就不能再卖了).卖一件商品消耗一个单位时间,售卖顺序是可以 ...
- POJ 1456 (贪心+并查集) Supermarket
有n件商品,每件商品有它的利润和售出的最后期限,问能够得到的最大利润是多少 这道题和 HDU 1789 Doing Homework again 几乎一模一样,只不过这个是求最的扣分,本题是求最大利润 ...
- POJ-1456 Supermarket(贪心,并查集优化)
Supermarket Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10725 Accepted: 4688 Descript ...
- Supermarket(贪心/并查集)
题目链接 原创的博客 题意: 超市里有N个商品. 第i个商品必须在保质期(第di天)之前卖掉, 若卖掉可让超市获得pi的利润. 每天只能卖一个商品. 现在你要让超市获得最大的利润. n , p[i], ...
随机推荐
- cicm0804吊起
CICS调用方法:cicslterm -r RGCIPS /////////////// CECI LINK P(CICM0804) COMM(F0000000000000000000006) --- ...
- 使用JavaScript实现弹出层效果
声明 阅读本文需要有一定的HTML.CSS和JavaScript基础 设计 实现弹出层效果的思路非常简单:将待显示的内容先隐藏,在触发某种条件后(如点击按钮),将原本隐藏的内容显示出来. 实现 < ...
- Delphi XE5教程5:程序的结构和语法
内容源自Delphi XE5 UPDATE 2官方帮助<Delphi Reference>,本人水平有限,欢迎各位高人修正相关错误! 也欢迎各位加入到Delphi学习资料汉化中来,有兴趣者 ...
- 1096. Consecutive Factors (20)
Among all the factors of a positive integer N, there may exist several consecutive numbers. For exam ...
- ASP.NET——拒绝访问。 (异常来自HRESULT:0x80070005 (E_ACCESSDENIED))
运行ASP.NET网站的时候出现下面这个问题,这个问题如图: 这个问题的解决方法为: 运行dcomcnfg 点 组件服务->服务->电脑->我的电脑->DCOM 配置 找到&q ...
- C# Socket连接请求超时机制
作者:RazanPaul 译者:Todd Wei 原文:http://www.codeproject.com/KB/IP/TimeOutSocket.aspx 介绍 您可能注意到了,.Net的Syst ...
- Struts之ForwardAction
在Struts中,通过action跳转jsp,但是有时希望仅仅只是跳转页面,而不需要action,这时可以用ForwardAction. 定义一个仅仅是跳转的ForwardAction如下: < ...
- 0x04 高级语法
while-endw .while(条件) 循环体(条件满足时执行) .endw repeat-until .repeat 循环体(条件不满足时执行) .until(条件) if-elseif-end ...
- DB天气app冲刺二阶段第六天
今天干了一件让我有点小激动的事情 就是我感觉我貌似找到了为什么我的项目会闪退了有的时候..但是还不确定.等会会再试试看看到底对不对.好吧其实今天就干了这些事整整一下午调试,找bug,决定从头开始一点一 ...
- 图片轮播插件-carouFredSel
carouFredSel图片轮播插件基于Jquery,比较常规的轮播插件,支持滚轮及键盘左右按键,加入其它插件可实现更加复杂的特效. 主页地址:http://caroufredsel.dev7stud ...