Chinaunix首页 | 论坛 | 博客
  • 博客访问: 350691
  • 博文数量: 122
  • 博客积分: 5000
  • 博客等级: 大校
  • 技术积分: 1191
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-24 11:12
文章分类

全部博文(122)

文章存档

2010年(122)

我的朋友

分类: C/C++

2010-03-17 21:39:24

 

资源来源:http://blog.chinaunix.net/u3/105033/index.html

 

一、问题描述

Description

A supermarket has a set Prod of products on sale. It earns a profit px for each product xProd 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 xSell, 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)=ΣxSellpx. 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

Hint

The sample input contains two product sets. The first set encodes the products from table 1. The second set is for 7 products. The profit of an optimal schedule for these products is 185.

 

二、解题思路

将输入的每组商品按利润从大到小进行排序,如果利润相同则按时间从大到小排序。用一个布尔数组b表示某时刻是否已经有商品卖出。比如b[3]==false,表示第3秒里没有安排卖出商品,可以在这一时间安排卖商品。然后使用贪心策略,从第1个商品开始往后搜索,将px安排到dx售出,如果dx已经有安排,将从dx往前搜索找到第一个空位置。如果找不到空位置,则跳过此商品,继续向后搜索直到所有商品都搜索完。

在搜索空位置安排商品时,这里采用顺序查找,可以考虑用并查集提高查找速度。

三、代码

 

#include<iostream>
#include<algorithm>
using namespace std;
struct mypair
{
    int p;
    int t;
};
mypair a[10001];
bool b[10001];
int cmp(const void *a ,const void * b)
{
    struct mypair * c=(mypair *)a;
    struct mypair * d=(mypair *)b;
    if(c->p != d->p)
        return d->p - c->p;
    else
        return d->t - c->t;
}
int main()
{
    int n;
    int i,j;
    int sum;
    while(cin>>n)
    {
        for(i=1;i<=n;++i)
        {
            cin>>a[i].p>>a[i].t;
            b[i]=false;
        }
        qsort(a+1,n,sizeof(a[1]),cmp);
        //for(i=1;i<=n;++i)

        //cout<
        sum=0;
        for(i=1;i<=n;++i)
        {
            if(b[a[i].t]==false)
            {
                sum+=a[i].p;
                b[a[i].t]=true;
                continue;
            }
            for(j=a[i].t;j>=1;--j)
            {
                if(b[j]==false)
                    break;
            }
            if(j>=1)
            {
                sum+=a[i].p;
                b[j]=true;
            }
        }
        cout<<sum<<endl;
    }
    return 0;
}


阅读(1964) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~