题目:
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;
}