一开始思路弄错了,刚开始想的时候误把所有截止时间为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(贪心+并查集优化)的更多相关文章

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

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

  2. Supermarket---poj456(贪心并查集优化)

    题目链接:http://poj.org/problem?id=1456 题意是现有n个物品,每个物品有一个保质期和一个利润,现在每天只能卖一个商品,问最大的利润是多少,商品如果过期了就不能卖了: 暴力 ...

  3. poj1456 Supermarket 贪心+并查集

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

  4. POJ 1456 - Supermarket - [贪心+小顶堆]

    题目链接:http://poj.org/problem?id=1456 Time Limit: 2000MS Memory Limit: 65536K Description A supermarke ...

  5. nyoj 208 + poj 1456 Supermarket (贪心)

    Supermarket 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 A supermarket has a set Prod of products on sal ...

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

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

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

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

  8. POJ-1456 Supermarket(贪心,并查集优化)

    Supermarket Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10725 Accepted: 4688 Descript ...

  9. Supermarket(贪心/并查集)

    题目链接 原创的博客 题意: 超市里有N个商品. 第i个商品必须在保质期(第di天)之前卖掉, 若卖掉可让超市获得pi的利润. 每天只能卖一个商品. 现在你要让超市获得最大的利润. n , p[i], ...

随机推荐

  1. Codevs 1474 十进制转m进制

    时间限制: 1 s    空间限制: 128000 KB    题目等级 : 白银 Silver 题目描述 Description 将十进制数n转换成m进制数 m<=16 n<=100 输 ...

  2. c/c++面试总结(1)

    最近在找新的工作,在找工作中遇到很多面试题,大多数让我很难堪,再次让我认识到自己的知识的匮乏,上份工作是以应届生的身份,所有当时进项目组也没有很多要求,进入项目组后自己还算好学(自己以为),之前也没有 ...

  3. 【OSG细节实现】节点围绕位于axisPos平行于axis的轴进行旋转

    //绕着与axis平行的任意轴旋转 void rotate(const std::string& name, float angle, osg::Vec3 axisPos, osg::Vec3 ...

  4. 【风马一族_Android】让app上传到Android市场的网站介绍

    豌豆荚  开发者中心 http://open.wandoujia.com/account/info China app http://www.chinaapp.org

  5. JDK 与 JRE (转)

    很多程序员已经干了一段时间java了依然不明白jdk与jre的区别.JDK就是Java Development Kit.简单的说JDK是面向开发人员使用的SDK,它提供了Java的开发环境和运行环境. ...

  6. Atan2

    在三角函数中,两个参数的函数atan2是正切函数的 一个变种.对于任意不同时等于0的实参数x和y,atan2(y,x)所表达的意思是坐标原点为起点,指向(x,y)的射线在坐标平面上与x轴正方向之间 的 ...

  7. 什么是AJAX技术及其常识

    1.什么是Ajax? Ajax的全称是:AsynchronousJavaScript+XML 2.Ajax的定义: Ajax不是一个技术,它实际上是几种技术,每种技术都有其独特这处,合在一起就成了一个 ...

  8. 使用awstats分析iis站点的日志

    环境:win7 + iis7 + perl(ActivePerl-5.20.1.2000) + awstats 7.3 一.找到iis日志所在目录 建议全部都打勾 二.安装perl AWStats是p ...

  9. php win主机下实现ISAPI_Rewrite伪静态

    有的win主机iss不支持 .htaccess 文件, 我在这里指的不是本地 在本地的话用apmserv服务器可以用.htaccess 文件,用apmserv服务器环境配置伪静态可以看 php 伪静态 ...

  10. 查找指定表的字段not null约束,并生成删除Sql

    SElECT 'ALTER TABLE '+OBJECT_NAME(c.parent_obj)+' DROP CONSTRAINT '+ c.name FROM sys.sysconstraints ...