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 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(贪心,并查集优化)的更多相关文章
- POJ 1456 Supermarket(贪心+并查集优化)
一开始思路弄错了,刚开始想的时候误把所有截止时间为2的不一定一定要在2的时候买,而是可以在1的时候买. 举个例子: 50 2 10 1 20 2 10 1 50+20 50 2 40 ...
- 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 几乎一模一样,只不过这个是求最的扣分,本题是求最大利润 ...
- Supermarket(贪心/并查集)
题目链接 原创的博客 题意: 超市里有N个商品. 第i个商品必须在保质期(第di天)之前卖掉, 若卖掉可让超市获得pi的利润. 每天只能卖一个商品. 现在你要让超市获得最大的利润. n , p[i], ...
随机推荐
- [RN] 05 - Let's start with UI Design
aws-mobile-react-native-starter 官方的例子,当然要摸一次. 代码要跑起来:aws-samples/aws-mobile-react-native-starter 教程: ...
- SpringBoot------文件上传
1.pom.xml引入依赖配置 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http ...
- Java实现非法访问异常
创建ExceptionTest类,在该类的main()方法中,使用反射获得String类的所有域,不要使用setAccessible方法修改这些域的可见性,然后通过反射获得私有域中与”hash”相匹配 ...
- Spring-Mybatis --- 配置SqlSessionFactoryBean,整合Spring-Mybatis
要利用Mybatis首先是需要导入mybatis-x.x.x.jar,其次,要整合Spring和Mybatis需要导入mybatis-spring-x.x.x.jar. JAR : mybatis-x ...
- 安装centos6.5
我是在虚拟机上面安装的centos6.5,本机的系统是windows 2008 datacenter. 到这个地方下载镜像文件:http://mirrors.sohu.com/centos/6.5/i ...
- 【GIS】使用GDAL为Leaflet切图
一.参考资料 https://commenthol.github.io/leaflet-rastercoords/ https://github.com/commenthol/gdal2tiles-l ...
- 使用powerdesigner连接MySQL并设置逆向工程图文教程
我用的是Win7 x64的系统,安装了64为的mysql-connector-odbc-5.1.10-winx64.msi在数据源中test正常,但在powerdesigner连接Mysql总是弹出“ ...
- Weblogic CVE-2018-2894 漏洞复现
0x01 前言 Oracle官方发布了7月份的关键补丁更新CPU(Critical Patch Update),其中针对可造成远程代码执行的高危漏洞 CVE-2018-2894 进行修复:http:/ ...
- RF-获取上个月份
验证1: case ${NowDate} set variable 20170103 ${year} set variable ${NowDate[0:4]} ${month} set variabl ...
- Nginx SSL配置
一.SSL 原理 ① 客户端( 浏览器 )发送一个 https 请求给服务器② 服务器要有一套证书,其实就是公钥和私钥,这套证书可以自己生成,也可以向组织申请,服务器会把公钥传输给客户端③ 客户端收到 ...