zoukankan      html  css  js  c++  java
  • POJ1456:Supermarket(并查集+贪心)

    Supermarket

    Time Limit: 2000MS   Memory Limit: 65536K
    Total Submissions: 17634   Accepted: 7920

    题目链接http://poj.org/problem?id=1456

    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个商品以及它们的利润和截至日期,每天只能卖出一个商品,截止日期过后就不能出售了,问最大利润是多少。

    题解:

    第一反应肯定是采用贪心的策略,选择一个最大利润的出售,但是因为这里有个日期,这里的贪心不一定可以得到最后的最大利润。

    所以我们也应该考虑日期,发现当出售商品在其截至日期时,是最优的,因为这将不会影响之前商品的出售。

    这里的贪心我们可以采用优先队列对其进行优化,并且日期要倒过来枚举(结合贪心策略想想)。

    这里我用的是并查集对其进行优化,商品出售的时间尽可能得接近其截至日期,如果在那天商品出售了,又有另外一个商品在那天出售,那么我们就挪到前一天进行出售。

    我们就用并查集维护离截止日期最近的空闲时间,查找速度挺快的。

    代码如下:

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <iostream>
    using namespace std;
    
    const int N = 10005; 
    int f[N];
    int n;
    
    struct node{
        int p,d;
        bool operator < (const node &A)const{
            return A.p<p;
        }
    }a[N];
    int find(int x){return f[x]==x ? f[x] : f[x]=find(f[x]);}
    int main(){
        while(~scanf("%d",&n)){
            for(int i=1;i<=10000;i++) f[i]=i;
            for(int i=1;i<=n;i++) scanf("%d%d",&a[i].p,&a[i].d);
            sort(a+1,a+n+1);
            int ans = 0;
            for(int i=1;i<=n;i++){
                int fd = find(a[i].d);
                if(fd>0){//存在空闲时间
                    ans+=a[i].p;
                    f[fd]=fd-1;
                }
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    C# 多态性
    C# FileStream类
    C# File文件类
    加快访问GitHub的速度
    Git-修改.gitignore后使其配置生效的方法总结
    ES6 解构赋值
    avue表单数据请求
    uniapp canvas组件复用
    uniappH5 fly.js Golang 解决跨域问题
    java bug记录
  • 原文地址:https://www.cnblogs.com/heyuhhh/p/9998744.html
Copyright © 2011-2022 走看看