超市

每个商品有收益p和时限d 求时限内的最大收益

法一: 当从前向后贪心的时候 可能会出现反悔的情况 这样局部最优解和全局最优解有不一致. 为了解决反悔问题,我们可以采用倒序贪心的方式

int main()
{
	while(scanf("%d",&n)!=EOF)
	{
		while(q.size()) q.pop();
		memset(s,0,sizeof s);
		for(int i=1;i<=n;i++)
		{
			int x=read(),y=read();
			s[i]=(Node){x,y};
		}
		sort(s+1,s+n+1,cmp);
		int t=0,ans=0;
		while(t<n)
		{
			do{
				t++;
				q.push( s[t].p );
			}while(s[t].d==s[t+1].d) ;
				
			for(int i=1;i<=s[t].d-s[t+1].d&&q.size();i++) 
				ans+=q.top(),q.pop();
		}
		printf("%d\n",ans);
	}
	return 0;
}

法二: 反悔堆 用于处理反悔贪心问题

维护一个堆,用后面集合的更优秀的解来替换前面集合较差的解。每次排除最劣解,加入较优解

posted @ 2022-01-21 19:06  __iostream  阅读(27)  评论(0)    收藏  举报