二、stl ,模拟,贪心等 [Cloned] S - 贪心

原题:

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. 

题意:

题目大意是买卖N件东西,每件东西都有个截止时间,在截止时间之前买都可以,而每个单位时间只能买一件。问最大获利。

题解:

显然贪心,结构体包括最后截止时间和价值,结构体数组按照价值排序,把价值高的在最接近截止时间的时间卖出去,和上上个题基本一样,贪心先卖贵的。

代码:AC

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef struct
{
	int value;
	int time;
}thing;
thing A[10003];
int B[10003];
bool compare(thing a,thing b)
{
	return a.value>b.value;
}
int main()
{
	int n;
	while(cin>>n)
	{
		int i;
		for(i=0;i<n;i++)
			cin>>A[i].value>>A[i].time;
		memset(B,0,sizeof(B));
		sort(A,A+n,compare);
		long long sum=0;
		for(i=0;i<n;i++)
		{
			while(B[A[i].time]&&A[i].time>0)
			{
				A[i].time--;
			}
			if(A[i].time>0)
			{
				sum+=A[i].value;
				B[A[i].time]=1;
			}
		}
		cout<<sum<<endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/npuyan/article/details/81395864
今日推荐