hdu - 4302 Holedox Eating (优先队列)

题目:

Holedox Eating


题意:

有一根长为L的管道和一个初始位置在最左端的动物,输入数据"0 x"表示此时在管道的左数x位置出现了一个食物,"1"表示动物想吃东西了:他会吃最近的食物,如果有多个最近的食物,就按照最近一次的移动方法移动,求所有命令结束后的动物移动路程。


思路:构造两个优先队列left和right,因为动物和食物的相对位置确定以后,一定是不会再改的。直接模拟所有情况即可


代码:

//#pragma comment(linker, "/STACK:102400000,102400000")
#include "iostream"
#include "cstring"
#include "algorithm"
#include "cmath"
#include "cstdio"
#include "sstream"
#include "queue"
#include "vector"
#include "string"
#include "stack"
#include "cstdlib"
#include "deque"
#include "fstream"
#include "map"
using namespace std;
typedef long long LL;
const int INF = 0x1fffffff;
const int MAXN = 1000000+100;
#define eps 1e-14
const int mod = 95041567;

int main()
{
    //freopen("in","r",stdin);
    //freopen("out","w",stdout);

    int t;
    scanf("%d",&t);

    for(int ka = 1 ; ka <= t ; ka++)
    {
        int L,n;
        scanf("%d%d",&L,&n);
        int pos=0;
        int last=1;
        int dis=0;

        priority_queue< int , vector<int> , greater<int> > right;
        priority_queue< int > left;

        for(int i = 0 ; i < n ; i++)
        {
            int a,b;

            scanf("%d",&a);

            if(a == 0)
            {
                scanf("%d",&b);
                if(b <= pos)
                    left.push(b);
                else
                    right.push(b);
            }

            else if(a == 1)
            {
                if(!left.empty() && !right.empty())
                {
                    int pos1 = left.top();
                    int pos2 = right.top();

                    if(pos - pos1 == pos2 - pos)
                    {
                        if(last == 1)
                        {
                            dis+=pos2-pos;
                            pos = pos2;
                            right.pop();
                        }
                        else
                        {
                            dis+=pos-pos1;
                            pos = pos1;
                            left.pop();
                        }
                    }
                    else if(pos - pos1 > pos2 - pos)
                    {
                        right.pop();
                        dis+=pos2-pos;
                        pos = pos2;
                        last=1;
                    }
                    else if(pos - pos1 < pos2 - pos)
                    {
                        left.pop();
                        if(pos != pos1)
                        {
                            dis+=pos-pos1;
                            pos = pos1;
                            last=-1;
                        }
                    }
                }
                else if(!left.empty())
                {
                    int pos1 = left.top();
                    left.pop();
                    if(pos != pos1)
                        {
                            dis+= pos-pos1;
                            pos = pos1;
                            last=-1;
                        }
                }
                else if(!right.empty())
                {
                    int pos2 = right.top();
                    right.pop();
                    dis+=pos2-pos;
                    pos = pos2;
                    last=1;
                }
            }
        }

        printf("Case %d: %d\n",ka,dis);
    }

    return 0;

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值