hdu 4302 Holedox Eating(优先队列)

题意:有一个小动物在长L的数轴上,最开始这只小动物在0点,每个时候,有可能有两种事件,第一种是数轴上某一点会出现一份食物,另一种是小动物想找吃的,这种情况小动物会找最近的一个食物,然后过去,如果两边的食物距离相同,那么就按最后一次移动的方向去,如果两边都没有食物,就呆在原地。

思路:刚开始想用线段树做来着,但是想了想感觉好麻烦,后来想这题其实就是从左边找个最大值,从右边找个最小值嘛,那就可以用两个优先队列搞了。还有一点就是注意一下当前位置就有食物的情况就行了。

 

代码:

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#define inf 0x3f3f3f3f
#define Inf 0x3FFFFFFFFFFFFFFFLL
#define eps 1e-9
#define pi acos(-1.0)
using namespace std;
typedef long long ll;
using namespace std;
int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int t,L,n,tcase=0;
    scanf("%d",&t);
    while(t--)
    {
        tcase++;
        priority_queue<int>ql;
        priority_queue<int,vector<int>,greater<int> >qr;
        scanf("%d%d",&L,&n);
        int now=0,scnt=0;
        int tp,v,lmove=-1;
        int sum=0;
        while(n--)
        {
            scanf("%d",&tp);
            if(tp)
            {
                if(scnt) scnt--;
                else
                {
                    int lp=-1,rp=-1;
                    if(!ql.empty()) lp=ql.top();
                    if(!qr.empty()) rp=qr.top();
                    if(lp==-1&&rp==-1) continue;
                    if(lp==-1) lmove=1;
                    else if(rp==-1) lmove=0;
                    else if(now-lp<rp-now) lmove=0;
                    else if(now-lp>rp-now) lmove=1;
                    if(lmove)
                    {
                        sum+=(rp-now);
                        now=rp;
                        scnt=0;
                        qr.pop();
                        while(!qr.empty()&&(qr.top()==rp))
                        {scnt++;qr.pop();}
                    }
                    else
                    {
                        sum+=(now-lp);
                        now=lp;
                        scnt=0;
                        ql.pop();
                        while(!ql.empty()&&(ql.top()==lp))
                        {scnt++;ql.pop();}
                    }
                }
            }
            else
            {
                scanf("%d",&v);
                if(v>now) qr.push(v);
                else if(v<now) ql.push(v);
                else scnt++;
            }
        }
        printf("Case %d: %d\n",tcase,sum);
    }
    return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值