并查集--贪心--Supermarket

并查集–贪心–Supermarket

Description
超市有一套出售的产品。它为在截止日期之前售出的每一件产品x∈产品赚取PX利润,DX是从销售开始之日起计算的单位时间的整数。每种产品的销售都需要一个单位的时间单位。销售计划是销售≤产品的一个订购子集,根据销售订单,每个产品x∈销售的销售都在DX截止日期之前或DX到期时完成。销售计划的利润是利润(出售)=ΣX∈出售PX最优销售计划是利润最大化的时间表。
例如,考虑产品prod={a,b,c,d}与(pa,da)=(50,2),(pb,db)=(10,1),(pc,dc)=(20,2)和(pd,dd)=(30,1)。表1列出了可能的销售时间表。例如,附表Sell={d,a}显示产品d的销售从时间0开始到时间1结束,而产品a的销售从时间1开始到时间2结束。销售是最优的时间表,其利润为80。
在这里插入图片描述
编写一个程序,从输入的文本文件中读取一组产品,并计算每组产品的最佳销售计划的利润。

Input
一组产品以整数0<=n<=10000(即集合中的产品数)开始,并以整数的n对pi di(1<=pi<=10000和1<=di<=10000)继续,它们指定了第一产品的利润和销售期限。空白可以在输入中自由出现。输入数据以文件结尾结束,并保证正确。

Output
对于每一组产品,程序在标准输出上打印出一套最优销售计划的利润。每个结果都是从一个单独行的开头打印出来的。

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

此题要求有一个贪心,还是使用结构体并查集,才用sort直接一手排序,这里要写一个比较方法,然后用sort排序结构体数组的成员大小

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <string>
#include <stack>
#include <queue>
#include <map>
using namespace std;
const int MAX = 1e4+5;
bool f[MAX];
struct Node
{
    int pi,di;
}m[MAX];
bool cmp(Node a,Node b)
{
    return a.pi>b.pi;
}
int main()
{
	int n;
    while(~scanf("%d",&n))
    {
        int sum=0;
        for(int i=0;i<n;i++)
            scanf("%d%d",&m[i].pi,&m[i].di);
        memset(f,true,sizeof(f));
        sort(m,m+n,cmp);
        for(int i=0;i<n;i++)
        {
            if(f[m[i].di]) 
            {
                sum+=m[i].pi;
                f[m[i].di]=false;
            }
            else//贪心 
            {
                for(int j=m[i].di-1;j>0;j--)
                {
                    if(f[j])
                    {
                        sum+=m[i].pi;
                        f[j]=false;
                        break;
                    } 
                }
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}
发布了19 篇原创文章 · 获赞 0 · 访问量 203

猜你喜欢

转载自blog.csdn.net/qq_45282116/article/details/104448728