Week4 作业A DDL的恐惧 贪心

题意:

有n个DDL(easy:1<=n<=1000,1<=DDL<=1000;hard:1<=n<=10^6,1<=DDL<=10^6),若不能在DDL前完成,会扣掉平时分,每天只能完成一个DDL。安排DDL的完成顺序,使扣掉的分数尽量少。

题目分析:

靠前的DDL可供安排的时间少,靠后的DDL可供安排的时间多,为了对其它的DDL影响尽量小,应从后往前安排。

从后向前枚举每一天,为每一天安排任务。对于某一天,在该天可以完成的所有任务中(DDL在该天及该天之后),应选取分数最高的一个任务完成,保证扣掉的分数最少。应用最大堆实现选择最大分数的任务,每次选择过程为O(logn),总的复杂度为O(nlogn)。

代码:

#include
#include
#include 
#include
using namespace std; 
int n;//DDL的数量
const int maxn=1e6+5;
struct DDL{
	int ddl;
	int val;
	bool operator<(const DDL &d)const{
		return ddl>d.ddl;//按ddl降序排列 
	}
};
DDL a[maxn]; 
priority_queue pq;
int main()
{
	int t; scanf("%d",&t);
	int sum=0;//总分数
	int get=0;//得到的分数 
	while(t--){
		sum=0; get=0;
		while(!pq.empty()) pq.pop();
		scanf("%d",&n);
		for(int i=0;i=1;i--)//从最大ddl的日期开始遍历 
		{	
			while(a[pos].ddl==i) pq.push(a[pos].val) , pos++;
			if(!pq.empty()) get+=pq.top() , pq.pop();
			
		}
		printf("%d\n",sum-get); 
	} 
	return 0;
} 

 

你可能感兴趣的:(#,贪心)