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’
比如,如果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); } }
相关文章推荐
- code review 沉思录
- Mac - 让NSView快捷的实现阴影效果
- 请教高手:javascript中var i = {};是什么意思
- Intellij Idea 创建JavaWeb项目
- VLAN device for 802.1.q on Linux
- 【JavaScript】闭包应用之数据独立
- c++ static笔记
- 下一代Android打包工具,1000个渠道包只需要5秒钟
- 93、QOS区分式服务配置实验之队列
- Memcached为数据库的查询数据缓存
- 图形用户界面( GUI )基本测试内容
- 使用参数innodb_file_per_table支持MySQL InnoDB表数据共享空间自动收缩
- iOS开发笔记--UIEdgeInsetsMake的作用
- linux上很方便的上传下载文件工具rz和sz
- 高校站点群建设方案简单介绍
- VS2013正确设置DLL环境变量目录的方法
- iOS -视频缩略图的制作
- 数据库存更新(update 语句)用法(转)
- POJ2175 费用流消负圈
- JS-OC交互专题1-截取网站字符串