贪心误区(POJ1456

Supermarket
Time Limit: 2000MS

Memory Limit: 65536K
Total Submissions: 16486

Accepted: 7416
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
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.
这个题就是让找出在已有计划里能够赚到最多的钱,计划已经给出了,这种求值问题,排列组合肯定是不合理的,复杂度太高,所以很自然的想到贪心,
贪心这种东西,能够想到点上就很容易了,一般是从条件苛刻,到条件宽松进行贪心,在这里时时间大的计划能在时间小的计划里实j计u小的就只能在前面实现,也就是说把计划尽量往后安排,才能前面最优条件,所以就这么办
这里需要注意一点,我在每分钟都是可以工作的,除非我手里一份计划也没有,(这是个坑,我掉了两次)

//贪心,优先队列优化
//时间晚的可以时间晚的时候完成,但是时间早的不能时间玩的时候完成
//所以从时间晚的向时间早的进行贪心
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
#define MAXN 10005
using namespace std;
struct node{
    int income;
    int time;
}m[MAXN];
priority_queue <node> que;


bool cmp(node a,node b){
    return a.time>b.time;
}

//重载了小于号
bool operator<(node a,node b){
    return a.income<b.income;
}

int main()
{
    int n;
    while(~scanf("%d",&n)){
        int maxtime = 0;
       for(int i=0;i<n;i++){
            scanf("%d%d",&m[i].income,&m[i].time);
            if(m[i].time>maxtime){
                maxtime = m[i].time;
            }
       }
       sort(m,m+n,cmp);
       long long  sum=0;
       while(!que.empty()){
            que.pop();
       }
       int i=0;
       for(int j=maxtime;j>0;j--){
            while(i<n&&m[i].time==j){
                que.push(m[i]);
                i++;
            }
            if(!que.empty()){
                sum+=que.top().income;
                que.pop();
            }
       }
       printf("%lld\n",sum);
    }
    return 0;

}

猜你喜欢

转载自blog.csdn.net/weixin_40488730/article/details/81583884