前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Supermarket超市(贪心算法 优先队列)- POJ 1456

Supermarket超市(贪心算法 优先队列)- POJ 1456

作者头像
ACM算法日常
发布于 2018-08-07 10:14:28
发布于 2018-08-07 10:14:28
76700
代码可运行
举报
文章被收录于专栏:ACM算法日常ACM算法日常
运行总次数:0
代码可运行

(TianMaXingKong童鞋的解题报告,好萌的~超厉害哦)

Description

A supermarket has a set Prod of products on sale. It earns a profit px for each product x∈Prod sold by a deadline dx that is measured as an integral number of time units starting from the moment the sale begins. Each product takes precisely one unit of time for being sold. A selling schedule is an ordered subset of products Sell ≤ Prod such that the selling of each product x∈Sell, according to the ordering of Sell, completes before the deadline dx or just when dx expires. The profit of the selling schedule is Profit(Sell)=Σx∈Sellpx. An optimal selling schedule is a schedule with a maximum profit. For example, consider the products Prod={a,b,c,d} with (pa,da)=(50,2), (pb,db)=(10,1), (pc,dc)=(20,2), and (pd,dd)=(30,1). The possible selling schedules are listed in table 1. For instance, the schedule Sell={d,a} shows that the selling of product d starts at time 0 and ends at time 1, while the selling of product a starts at time 1 and ends at time 2. Each of these products is sold by its deadline. Sell is the optimal schedule and its profit is 80.

POJ 一个学习英语的好地方,哈哈哈=( ̄︶ ̄)=

参考翻译:(水平有限,欢迎批评)

一家超市有一套商品Prod待售。它每个商品 x∈Prod 的盈利为 px ,期限 dx 是从销售开始就被计算的一个整数时间单位。每件商品需要精确地占用一个单位的时间以被销售。一个销售时间表是商品 Sell ≤ Prod 的一个有序子集,以便于每件商品 x∈Prod

的销售根据 Sell 排序,需在期限dx之前或者就在dx到期时完成。销售时间表的好处是 Profit(Sell)=Σx∈Sellpx。一个最优的销售时间表是个可以利润最大化的时间表。

举个例Prod={a,b,c,d}, (pa,da)=(50,2) , (pb,db)=(10,1) , (pc,dc)=(20,2) , (pd,dd)=(30,1) .可能的销售时间表被罗列在表1。例如,时间表Sell = {d,a}表示商品 d 的 销售从时间0开始,到时间1结束,而商品 a 的销售从时间1开始,到时间2结束。这些商品的每一件都在截止前销售。Sell 是最优时间表,且利润为80。

Write a program that reads sets of products from an input text file and computes the profit of an optimal selling schedule for each set of products.

编写一个程序,从输入的文本文件中读取多组产品,并计算每组产品的最佳销售时间表的利润。

Input

A set of products starts with an integer 0 <= n <= 10000, which is the number of products in the set, and continues with n pairs pi di of integers, 1 <= pi <= 10000 and 1 <= di <= 10000, that designate the profit and the selling deadline of the i-th product. White spaces can occur freely in input. Input data terminate with an end of file and are guaranteed correct.

一组产品以0 <= n <= 10000的整数开始,该整数是该组中的产品的数量,并且继续n组整数pi di,1 <= pi <= 10000和1 <= di <= 10000,表示第i种产品的利润和销售期限。输入空白可以自由发生。输入数据以文件结尾终止并保证正确。

Output

For each set of products, the program prints on the standard output the profit of an optimal selling schedule for the set. Each result is printed from the beginning of a separate line.

对于每一组产品,该程序在标准输出上打印该组的最佳销售时间表的利润。每个结果都从单独一行的开头打印。

Sample Input

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
4  50 2  10 1   20 2   30 1

7  20 1   2 1   10 3  100 2   8 2
   5 20  50 10

Sample Output

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
80
185

Hint

The sample input contains two product sets. The first set encodes the products from table 1. The second set is for 7 products. The profit of an optimal schedule for these products is 185.

样本输入包含两个产品组。第一组编码表1中的产品。第二组编码7个产品。这些产品的最佳时间表的利润是185。

分析:

题目大意是: 超市有堆商品要卖,但是它们有不同的利润和期限,得在此期限前卖出去,不一定要全部卖出,但是要求利润可以最大化。这些商品是从同一天开始一起贩卖的,每天只能卖一种商品。

比如这堆商品分为a,b,c,d四种

(pa,da)=(50,2) , (pb,db)=(10,1) , (pc,dc)=(20,2) , (pd,dd)=(30,1)

总共卖的天数=商品中期限最长的时间,所以为2天

0-1第1天d=30(要把a留到第二天卖,所以只有三种可以选,同选利润最大的)

0-2第2天a=50(只有a和c可以卖,选择利润最大的)

这是典型的贪心算法问题(活动安排)+优先队列。

输入不定测试组,以文件结尾结束,每组先输入一个n,然后是输入n组 pi di ,表示第 i 个商品的利润和 deadline

1. 按照 dx 和 px 从大到小排序

2. 建立优先队列 big

3. 从截止日期开始一天一天往前找截止日期内的,且还没有被卖过的,利润最大的商品

4. 在 big 中 push() 进 day 到 最大截止日期的所有商品的利润值

5. 注意不要重复压入哦

再举个例吧:

7 20 1 2 1 10 3 100 2 8 2 5 20 50 10

排序后:

5 20

50 10

10 3

100 2

8 2

20 1

2 1

第20天时选择最大利润商品,即x[0].dx ,第11-19天,无商品可卖。。。第10天选50,第三天选10。。。

最后结果为:20+10+10+50+5=85

AC代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<iostream>
#include<queue>
#include<algorithm>
#define maxn 100001
using namespace std;
int out[maxn], longth = 0;
class X
{
public:
    int px;
    int dx;
};
bool sort_dx_px(const X &x1, const X &x2)
{
    if (x1.dx > x2.dx)  return true;
    else    if (x1.dx == x2.dx)
    {
        if (x1.px > x2.px)
            return true;
        else
            return false;
    }
    else
        return false;

}
int main()
{
    int n = 0;
    while (scanf("%d", &n) != EOF)
    {
        X *x = new X[n];                //动态构建,节约空间
        int maxx = 0;                   //当前数据组的最大利润
        if (n == 0)
        {
            out[longth++] = 0;
            continue;
        }
        for (int i = 0; i < n; i++)
            cin >> x[i].px >> x[i].dx;
        sort(x, x + n, sort_dx_px);     // 按照 dx 和 px 从小到大排列
        priority_queue<int> big;        //优先队列
        //从截止日期 一天一天 往前找 期限内的利润最大的商品
        int i = 0;
        for (int day = x[0].dx; day > 0; day--)
        {
            for (; i < n && day <= x[i].dx; i++)
            {
                if (day > x[i - 1].dx)  break;
                big.push(x[i].px);
            }
            while (!big.empty())
            {
                maxx += big.top();
                big.pop(); break;
            }
        }
        out[longth++] = maxx;
        delete[] x;     //消除内存空间
    }
    for (int i = 0; i < longth; i++)
    {
        cout << out[i] << endl;
    }
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-04-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ACM算法日常 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
POJ-1456 Supermarket(贪心,并查集优化)
Supermarket Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10725 Accepted: 4688 Description A supermarket has a set Prod of products on sale. It earns a profit px for each product x∈Prod sold by a deadline dx that is measured
ShenduCC
2018/04/25
7740
经典算法之贪心算法
  贪心算法,又称贪婪算法(Greedy Algorithm),是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优解出发来考虑,它所做出的仅是在某种意义上的局部最优解。  
用户3467126
2019/11/08
1.7K0
前端也能学算法:由浅入深讲解贪心算法
贪心算法是一种很常见的算法思想,而且很好理解,因为它符合人们一般的思维习惯。下面我们由浅入深的来讲讲贪心算法。
蒋鹏飞
2020/10/15
5060
前端也能学算法:由浅入深讲解贪心算法
【前端算法】买卖股票的最佳时机含手续费—— 贪心算法、动态规划实现
给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;整数 fee 代表了交易股票的手续费用。
徐小夕
2022/02/09
3340
贪心算法思想与练习
给定一个长度为 N 的数组,数组中的第 i 个数字表示一个给定股票在第 i 天的价格。
timerring
2023/03/24
6180
贪心算法思想与练习
零基础学贪心算法
本文在写作过程中参考了大量资料,不能一一列举,还请见谅。 贪心算法的定义: 贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。 解题的一般步骤是: 1.建立数学模型来描述问题; 2.把求解的问题分成若干个子问题; 3.对每一子问题求解,得到子问题的局部最优解; 4.把子问题的局部最
Angel_Kitty
2018/04/08
1K0
零基础学贪心算法
贪心算法
贪心算法:分阶段的工作,在每个阶段做出当前最好的选择,从而希望得到结果是最好或最优的算法。
_春华秋实
2019/02/22
5430
3.1 金融市场和期货
一个本来是对冲的交易可能实际成了投机行为,这是操作风险。 所以使用衍生品时,需要设定好风险的限额。
rocket
2018/09/14
6.5K1
3.1 金融市场和期货
贪心算法:买卖股票的最佳时机II
题目链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/
代码随想录
2020/12/14
4390
贪心算法:买卖股票的最佳时机II
python买卖股票的最佳时机--贪心/
     设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
py3study
2020/01/17
1.1K0
八十二、Python | Leetcode贪心算法系列
作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件。导致翘课严重,专业排名中下。.在大学60%的时间,都在CSDN。决定今天比昨天要更加努力。前面文章,点击下面链接
润森
2020/07/10
9930
贪心算法总结贪心算法基本思路算法实现实例分析参考
贪心算法 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。 贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。 基本思路 建立数学模型来描述问题; 把求解的问题分成若干个子问题; 对每一子问题求解,得到子问题的局部最优解; 把子问题的解局部最优解合成原来解问题的一个解。 算法实现 从问题的某个初始解出发
致Great
2018/04/11
11.9K0
贪心算法总结贪心算法基本思路算法实现实例分析参考
开源软件的商业模式
Business models for open-source software / 开源软件的商业模式
开源社
2022/04/11
2.2K0
大数据实战|怎样实现大型电商热销榜?
上次给粉丝的福利,购买极客时间课程,浪尖这里返现:球友24元,非球友10元或者8折入球。大家还记得吗,发现很多粉丝比较滞后,这两天还陆续找我要返现,,,今天看了一下,极客时间优惠还剩两天吧,过了这两天就真没返现了,找我,我也不能贴补你,,,活动详情可以阅读下文。扫文末二维码购买然后联系浪尖。
Spark学习技巧
2019/05/14
1.1K0
大数据实战|怎样实现大型电商热销榜?
【代码随想录】二刷-贪心算法
贪心算法 什么是贪心? 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 贪心没有规定的套路。 刷题或面试的时候,手动模拟一下感觉可以局部最优退出整体最优,而且想不到反例,那么就试一试贪心。 贪心算法一般分为如下四步: 将问题分为若干子问题 找出合适的贪心策略 求解每一个子问题的最优解 将局部最优解堆叠成全局最优解 ---- 455. 分发饼干 方法1: 充分利用每个饼干的大小,用大块的饼干优先喂饱大胃口的孩子 class Solution { public:
半生瓜的blog
2023/05/13
4280
【代码随想录】二刷-贪心算法
ACM之贪心算法
所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最优解。也就是说,不 从整体最优上加以考虑,它所做出的仅仅是在某种意义上的局部最优解。 贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是, 贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性 (即某个状态以后的过程不会影响以前的状态,只与当前状态有关。) 所以,对所采用的贪心策略一定要仔细分析其是否满足无后效性。
Tanger
2021/06/16
7591
在线杂货店必须现代化数字平台才能蓬勃发展
一个是COVID之前时代传统杂货市场的领域,当时大多数消费者都在杂货店购物。另一个市场是当今的购物者,网上购物者蜂拥而至,而不是实体购物。随着客户选择与社会保持距离,他们现在越来越多地利用在线杂货平台进行送货或路边取货。
用户8078865
2020/12/25
4480
LeetCode数据库题目集合
编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:
MiChong
2021/02/24
9390
LeetCode数据库题目集合
国庆手撸商品管理系统(三)
之前的内容 点我管理系统(一) 点我管理系统(二) 一.实现的内容 商品退货 商品库存 商品进货 商品删除 商品还原 时钟 优化模型 二.后续内容准备优化内容 把数据库查询的内容存在缓存中 增加按日期,按商品名查询 增加快捷商品增加 优化代码 优化界面 三.目录结构 drf_test |___drf_api | |___admin.py | |___apps.py | |___migrations | |___models.py | |
小小咸鱼YwY
2020/06/19
8840
平台之路
几年前,马克•贝尼奥夫(Marc Benioff)告诉我,他对开发后台办公应用程序不感兴趣,因为后者会在ERP和金融市场上与SAP和甲骨文(Oracle)竞争。很多人,包括我自己,都对这个想法表示怀疑
甜甜圈
2020/12/04
6040
相关推荐
POJ-1456 Supermarket(贪心,并查集优化)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文