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 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.

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.

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

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

80

185

题意:

超市有n个商品,每个商品都是利润和保质期,每天只卖一种,问,怎么卖才可以获得最大利润,求出最大利润

思路:

贪心,这个题目我一开始看到,觉得可以用背包做啊,和背包题目很像啊。为什么这道题目可以用贪心做呢?这里说一下我对贪心和动态规划的理解:贪心就是每次都选取最优的结果就会是最优的,比如遇到背包问题,如果每个物品的体积都是1,那么就完全可以用贪心解决。但是如果每个物品的体积不一样呢?就不可以用贪心,贪心会错,自己体会。这是动态规划和贪心的区别。这道题目可以用贪心做,这里要贪两个地方,首先我先卖利润最大的商品,这是第一个贪。其次利润最大的商品应该尽量在后面卖,接近保质期的时间卖,这样前面的时间可以多卖一些其他的商品让利润最大,这是第二个贪。这道题目由于每个商品卖的时间都是1天,如果时间不固定,就不可以用贪心。和前面的道理是一样的,这里给一个另一个hdu的题目的博客,就可以体会到贪心和动态规划的区别。

http://blog.csdn.net/Dacc123/article/details/50397213

这道题目还有一个用并查集优化的方法,算是对并查集的一个应用。

贪心:

#include <iostream>
#include <math.h>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <stdlib.h> using namespace std;
#define MAX 100000
int n;
int vis[MAX+5];
struct Node
{
int price;
int time;
}a[MAX+5];
int cmp(Node a,Node b)
{
if(a.price==b.price)
return a.time<b.time;
return a.price>b.price;
}
int main()
{
int ans;
while(scanf("%d",&n)!=EOF)
{
memset(vis,0,sizeof(vis));
ans=0;
for(int i=1;i<=n;i++)
scanf("%d%d",&a[i].price,&a[i].time);
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)
{
for(int j=a[i].time;j>=1;j--)
{
if(!vis[j])
{
ans+=a[i].price;
vis[j]=1;
break;
}
}
}
printf("%d\n",ans);
}
}

并查集优化:

#include <iostream>
#include <math.h>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <stdlib.h> using namespace std;
#define MAX 100000
int n;
int vis[MAX+5];
struct Node
{
int price;
int time;
}a[MAX+5];
int cmp(Node a,Node b)
{
return a.price>b.price;
}
int father[MAX+5];
int find(int x)
{
if(x!=father[x])
father[x]=find(father[x]);
return father[x];
}
void init()
{
for(int i=0;i<=MAX;i++)
father[i]=i;
}
int main()
{
int ans;
while(scanf("%d",&n)!=EOF)
{
init();
ans=0;
for(int i=1;i<=n;i++)
scanf("%d%d",&a[i].price,&a[i].time);
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)
{
int b;
b=find(a[i].time);
if(b>0)
{
ans+=a[i].price;
father[b]=b-1;
}
}
printf("%d\n",ans);
}
}

POJ-1456 Supermarket(贪心,并查集优化)的更多相关文章

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

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

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

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

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

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

  4. poj1456 Supermarket 贪心+并查集

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

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

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

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

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

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

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

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

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

  9. Supermarket(贪心/并查集)

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

随机推荐

  1. iOS UITextField控件总结

    先声明下面总结不是自己写的. 参考网址:http://blog.csdn.net/tskyfree/article/details/8121915 //初始化textfield并设置位置及大小   U ...

  2. 正则 /\D/g

    onKeyUp="this.value=this.value.replace(/\D/g,'');"红色的是什么意识 /g是什么意思 ----------------------- ...

  3. Java并发编程、内存模型与Volatile

    http://www.importnew.com/24082.html  volatile关键字 http://www.importnew.com/16142.html  ConcurrentHash ...

  4. struts2 第一次使用 404 页面引发的一系列问题

    环境:ubuntu  . eclipse.struts-2.3.24 问题描写叙述: 1.  struts2 訪问出现404 2.  严重: Exception starting filter Str ...

  5. Java获取一维数组的最小值

    编写程序,实现接受用户在文本框中输入的单行数据.这些数据都是整数数字,以空格进行分隔,空格数量不限.并将这些数据分割成一维数组,再从数组中提取最小值显示在界面中.思路是先对用户的输入进行验证,即先用t ...

  6. SpringMVC由浅入深day01_12.4 pojo绑定_12.5自定义参数绑定实现日期类型绑定_12.6集合类

    12.4 pojo绑定 页面中input的name和controller的pojo形参中的属性名称一致,将页面中数据绑定到pojo. 页面定义: controller的pojo形参的定义: 打断点测试 ...

  7. HDOJ 4276 The Ghost Blows Light(树形DP)

    Problem Description My name is Hu Bayi, robing an ancient tomb in Tibet. The tomb consists of N room ...

  8. Python中的类(中)

    上一篇介绍了Python中类相关的一些基本点,本文看看Python中类的继承和__slots__属性. 继承 在Python中,同时支持单继承与多继承,一般语法如下: class SubClassNa ...

  9. lua 对表的简单序列化与反序列化

    参考文档:http://blog.csdn.net/xiaodan007/article/details/7096718 function sz_T2S(_t) local szRet = " ...

  10. Excel导出到浏览器(个人备份)

    /// <summary>  /// Excel导出  /// </summary>  /// <param name="dt"></pa ...