POJ1456 Supermarket (!easy)

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.

题目大意:多组测试数据,每组n个物品,给定价值和售出期限,要求在期限之前卖出商品,同一时刻只能售出一个商品,求能得到的最大价值。

思路:看到题目就醉了。。。赤裸裸的贪心,不过O(n^2)也是醉了。。。后来明白可以用堆来优化,但不会写啊!!!我又不是xxy。于是就用并查集优化了。。。神奇!!!
我们把连续的被占用的区间看成一个集合(子树),它的根结点为这个区间左边第一个未被占用的区间。先排序,然后每次判断Find(b[i])是否大于0,大于0说明左边还有未被占用的空间,则占用它,然后合并(rool(b[i]), rool(rool(b[i]) – 1)即可。同样这里我们规定只能左边的子树合并到右边的子树。
理解了方法,code也就很出来了。。。

code:

#include<iostream>

#include<algorithm>

#include<cstdio>

#include<cstring>

using namespace std;

int fa[10001]={0};

struct use{

int va,ti;

}a[10001];

int rool(int x)

{

if (fa[x]!=x) fa[x]=rool(fa[x]);

return fa[x];

}

int my_comp(const use &x,const use &y)

{

if (x.va>y.va) return 1;

else

{

if (x.va==y.va&&x.ti<y.ti) return 1;

else return 0;

}

}

int main()

{

int n,i,j,r1,maxn;

long long ans;

while(scanf("%d",&n)==1)

{

ans=0;

maxn=0;

for (i=1;i<=n;++i)

{

scanf("%d%d",&a[i].va,&a[i].ti);

if (a[i].ti>maxn) maxn=a[i].ti;

}

for (i=1;i<=maxn;++i)

fa[i]=i;

sort(a+1,a+n+1,my_comp);

for (i=1;i<=n;++i)

{

r1=rool(a[i].ti);

if (r1>0)

{

fa[r1]=rool(r1-1);

ans=ans+a[i].va;

}

}

printf("%lld\n",ans);

}

}

(附加:codevs1052是同类的题目)

时间: 2024-10-11 06:42:18

POJ1456 Supermarket (!easy)的相关文章

编程题:用递归调用实现,求N!(!阶乘)。

#include<stdio.h> long fac(int n) { if(n==1) return 1L;             /*"1L"为长整型常量*/ else return n*fac(n-1); } void main() {int m; scanf("%d",&m); printf("%2d!=%d\n",m,fac(m)); } 算法解析: 运行结果: 编程题:用递归调用实现,求N!(!阶乘).,布布扣,

抓取网站数据不再是难事了,Fizzler(So Easy)全能搞定

首先从标题说起,为啥说抓取网站数据不再难(其实抓取网站数据有一定难度),SO EASY!!!使用Fizzler全搞定,我相信大多数人或公司应该都有抓取别人网站数据的经历,比如说我们博客园每次发表完文章都会被其他网站给抓取去了,不信你们看看就知道了.还有人抓取别人网站上的邮箱.电话号码.QQ等等有用信息,这些信息抓取下来肯定可以卖钱或者干其他事情,我们每天都会时不时接到垃圾短信或邮件,可能就这么回事了,有同感吧,O(∩_∩)O哈哈~. 本人前段时间了写了两个程序,一个程序是抓取某彩票网站的数据(双

Fizzler(So Easy)关于抓取网站数据,不再困难

首先从标题说起,为啥说抓取网站数据不再难(其实抓取网站数据有一定难度),SO EASY!!!使用Fizzler全搞定,我相信大多数人或公司应该都有抓取别人网站数据的经历,比如说我们博客园每次发表完文章都会被其他网站给抓取去了,不信你们看看就知道了.还有人抓取别人网站上的邮箱.电话号码.QQ等等有用信息,这些信息抓取下来肯定可以卖钱或者干其他事情,我们每天都会时不时接到垃圾短信或邮件,可能就这么回事了,有同感吧,O(∩_∩)O哈哈~. 本人前段时间了写了两个程序,一个程序是抓取某彩票网站的数据(双

[POJ1456]Supermarket(贪心 + 优先队列 || 并查集)

传送门 1.贪心 + 优先队列 按照时间排序从前往后 很简单不多说 ——代码 1 #include <queue> 2 #include <cstdio> 3 #include <iostream> 4 #include <algorithm> 5 #define N 10001 6 7 int n, t, ans; 8 std::priority_queue <int, std::vector <int>, std::greater &l

图解傅里叶变换(so easy)

话不多说先上两个GIF图. 第一个动画和第二个动画其实都是对时域的周期矩形形波(近似看成矩形波,并不是严格意义的矩形方波)进行傅里叶变换分析. 对于第一个图形来说,它侧重展示变换的本质之一:叠加性,每个圆代表一个谐波分量. 第二个图形则侧重展示离散的频谱图. 但是这两个图形其实都只是展示了周期信号的频谱分析,对应的都是离散谱,而且都只是对一种很特殊的时域波形进行的分析.不过通过这两个动画,想必对傅里叶变化也有了更深刻的印象吧!

isPostback 的原理及作用(很easy)

1.IsPostBack用来推断表单是否是回发. (不是第一次请求),是点击表单的提交button回发过来的.是否是回发与get请求还是Post请求无关.可是普通情况下回发都是Post请求. 一般Get请求都是第一次载入. 2.仅仅有当使用server端表单<form runat="server">IsPostBack才干够使用. 假设使用client表单,则IsPostBack永远都是False.由于当使用server端表单的时候会自己主动生成一个隐藏域,才该隐藏域中,s

VC开发多语言界面 多种方法(非常easy) 有源代码

源代码地址(专业定制程序:MCU.Windows,Android ,VC串口,Android蓝牙等不限. ) (需源代码先留邮箱)先上图 1.通过遍历 得到全部控件ID号与TEXT,得到一个中文语言配置文件 void CVV_485Dlg::getCaptionForWindow() //做程序时用.其他时间不用 { //枚举对话框中全部组件 CWnd *pCtrl = GetWindow(GW_CHILD); while(pCtrl!=NULL) { UINT ctrlID = pCtrl->

华为trunk附案例(so easy)

实验环境:华为模拟器 1.           配置pc机ip(192.168.10.1 192.168.20.1 192.168.10.2   192.168.20.2),子掩:255.255.255.0 2,给交换机添加vlan10,VLAN20, vlan 10 quit Vlan 20 Quit Interface g0/0/1 Port link-type access Port   default vlan 10 Quit Interface   g0/0/2 Port   link

STL中的拷贝替换算法(so easy)

#include"vector" using namespace std; #include"string" #include"algorithm" #include<iostream> void printV(vector<int > tem) { for (vector<int>::iterator it = tem.begin(); it != tem.end(); it++) { cout <&l