zoukankan      html  css  js  c++  java
  • Supermarket

    Supermarket

    Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u
    Submit Status

    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.
    并查集优化:
        首先了解p值越大,更应该卖出,所以我们可以考虑在最后时期 d值 时卖出,该时期如若已被其他物品占有,就往前搜索,找到空余的时间卖出。
        然后用并查集优化搜索过程,如若确定该时间被卖物品,构造树pre[x] = x - 1;这样通过find()就阔以快速地寻找到空余时间了。
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int pre[10005];
    struct node{
        int p,d;
        bool operator<(const node &x)const{
            return p > x.p;
        }
    }a[10005];
    void init(){
        for(int i = 1; i <= 10000; i++)
            pre[i] = i;
    }
    int find(int x){
        return pre[x] == x ? pre[x] : pre[x] = find(pre[x]);
    }
    int main(){
        int n;
        while(~scanf("%d",&n)){
            int ans = 0;
            init();
            for(int i = 0; i < n; i++){
                scanf("%d%d",&a[i].p,&a[i].d);
            }
            sort(a,a+n);
            for(int i = 0; i < n; i++){
                int fi = find(a[i].d);
                if(fi > 0){
                    ans += a[i].p;
                    pre[fi] = fi-1;
                }
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    MinDoc v0.6 发布,轻量级文档在线管理系统
    PostMessage和SendMessage有什么区别?(有EnumChildWindowsProc的例子)
    将QuickReport报表保存为图片(使用TMetaFile和TMetafileCanvas)
    如何将JPEG缩略图放到LISTVIEW中(delphi listview自绘图形)
    栈和队列
    SQL调优日志--内存问题
    Nancy之实现API
    JAVA和.NET互调用
    NET Core环境并创建运行ASP.NET网站
    React Native
  • 原文地址:https://www.cnblogs.com/ACMessi/p/4838857.html
Copyright © 2011-2022 走看看