您的位置:首页 > 其它

Poj 2586 解题报告

2016-01-25 10:53 274 查看
一个超市有一个待售商品集合Prod,集合中每一个商品都有一个最晚销售时间,每一个产品都需要一个单独的单位时间销售(即两件商品不能同时销售),一个销售计划是一个有序子集Sell,Sell<=Prod,根据子集中的顺序,每一个商品都能在规定时间前销售出去。一个销售计划的利润则为Sell中的所有商品的利润和。

比如,如果Prod={a,b,c,d}, (pa,da)=(50,2), (pb,db)=(10,1), (pc,dc)=(20,2), (pd,dd)=(30,1),其中p*表示商品*的价值,d*表示商品的最晚销售时间。比如一个销售计划Sell={d,a},d在0开始1时刻结束销售,a在1开始2时刻结束销售,所有商品都在规定时间前完成了销售,其利润为80,其他销售计划如下图:

写一个程序,来计算一个Prod的最大利润销售计划是多少利润。

输入:

一组数据以一个整数n(0 <= n <= 10000)开始,接下来有n对pi,di,1
<= pi <= 10000 and 1 <= di <= 10000,数与数之间有空格隔开。

输出:

每组数据一行,输出最大利润是多少

样例输入:

4 50 2 10 1 20 2 30 1

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

样例输出:

80

185

题意:

只有在销售时间内售出的货物可以得到对应d的利润,同一时段只能卖一个货物,怎么得到最大利润

思路:(贪心)

将所有的利润进行排序,先让当前利润最高的货物在规定时间的最后一天卖出,如果规定时间被占(用一个visit数组来存时间是否被占用),则向前搜索没有被占用的时间,在那一天卖出此货物。

解释:因为题目并没有要求输出sell的顺序,只要求输出最大利润,所以只要保证利润大的卖出,且卖出时间越靠后可以让后面利润低的越有机会卖出。

注意:

1.
要用结构体来存一个货物的时间限制和利润。因为排序的时候会让他们的顺序混乱,不能一一对应

2.
读入的时候不知道有几组数据,所以要判定文件是否读完,即判定文件结束符‘EOF’

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
using namespace std;
struct good{
int p,d;
};
good a[20000];
bool cmp(good g,good h)
{
if(g.p>h.p) return true;
else if(g.p<h.p) return false;
else if(g.p==h.p)
{
if(g.d>h.d) return true;
else return false;
}
}
int main()
{
int n,visit[20000],tot;
//freopen("good.txt","r",stdin);
while(scanf("%d",&n)!=EOF)
{

memset(visit,0,sizeof(visit));
tot=0;

for(int i=1;i<=n;i++)
{
scanf("%d%d",&a[i].p,&a[i].d);
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)
{
if(!visit[a[i].d])
{
visit[a[i].d]=1;
tot+=a[i].p;
}
else
{
for(int j=a[i].d;j>=1;j--)
{
if(!visit[j])
{
tot+=a[i].p;
visit[j]=1;
break;
}
}
}
}
printf("%d\n",tot);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: