• POJ 3614 Sunscreen 优先队列


    http://poj.org/problem?id=3614

    题目大意:

    给你一些母牛,母牛有能容忍日光浴的最小和最大光照强度。每仅仅母牛能够涂一次SPF,SPF能够将母牛能够承受的光照强度固定在某个地方。如今给你母牛的最小和最大值和不同的spf的光照强度及其数量,求最多能够有多少母牛享受日光浴?

    思路:

    优先队列。

    先按母牛最小承受的排好,然后spf的值也从小到大。

    接下来用优先队列(栈顶为最小的)。对于每一个spf,假设一仅仅母牛的最小值小于等于spf则将其最大值入队。(贪心。。如两个母牛一仅仅【1,4】一仅仅【1,5】那么相同情况下选【1,4】不会差于【1,5】)

    详见代码。



    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    using namespace std;
    const int MAXN=2500+10;
    struct cow
    {
    	int min,max;
    	bool operator < (const cow& x)const{
    		return min<x.min;
    	}
    }cow[MAXN];
    
    struct spf
    {
    	int num,val;
    		bool operator < (const spf& x)const{
    			return val<x.val;
    	}
    }spf[MAXN];
    
    struct data
    {
    	int val;
    	data(int val=0) :val(val){}
    	bool operator <(const data& x)const{
    		return val > x.val;
    	}
    };
    priority_queue<data> q;
    
    int main()
    {
    	int c,l;
    	while(~scanf("%d%d",&c,&l))
    	{
    		while(!q.empty())
    			q.pop();
    
    		for(int i=0;i<c;i++)
    			scanf("%d%d",&cow[i].min,&cow[i].max);
    		for(int i=0;i<l;i++)
    			scanf("%d%d",&spf[i].val,&spf[i].num);
    
    		sort(cow,cow+c);
    		sort(spf,spf+l);
    
    		int ans=0;
    		int j=0;
    		for(int i=0;i<l;i++)
    		{
    			while(j<c && cow[j].min <= spf[i].val)
    			{
    				q.push(data(cow[j].max));
    				j++;
    			}
    
    			while(spf[i].num && !q.empty())
    			{
    				int cur=q.top().val;
    				q.pop();
    				if(cur < spf[i].val) continue;
    				spf[i].num--;
    				ans++;
    			}
    
    		}
    		printf("%d
    ",ans);
    	}
    	return 0;
    }



  • 相关阅读:
    性能学习-了解前端性能测试
    Python变量类型说明
    Python 标识符说明
    极验验证码-判断需要移动的距离
    极验验证码-userresponse.js
    转载系列
    loadrunner java vuser
    java DES
    java AES
    极验验证码流程-4字段加密
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/3783759.html
Copyright © 2020-2023  润新知