http://acm.hdu.edu.cn/showproblem.php?pid=4302
题目大意:一个虫子开始在0点,输入n个操作,0 x表示x处出现一个食物,1表示虫子从当前位置去吃一个最近的食物,若有俩最近食物,则吃和上一次行走方向相同的那个,输出步数。
解题思路:优先队列,判断下上次方向即可,wa了N次因为INF开的int最大,做加法的时候爆int了= =。
优先队列用法可以看下http://www.cppblog.com/Darren/archive/2009/06/09/87224.html
代码:
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <queue>
#include <algorithm>
#define MAXN 0
#define INF 0x7fffffff
#define eps 1e-10
#define MAX(x,y) ((x)>(y)? (x):(y))
#define MIN(x,y) ((x)<(y)? (x):(y))
#define MEM(a) (memset((a),0,sizeof(a)))
#define FRE freopen("input.txt","r",stdin)
using namespace std;
priority_queue<int> L; //大顶堆
priority_queue<int,vector<int>,greater<int> > R; //小顶堆
int main()
{
int T;
scanf("%d",&T);
for(int cas=1;cas<=T;cas++)
{
while(!L.empty()) L.pop();
while(!R.empty()) R.pop();
int len,n,pos=0,dir=1;
__int64 ans=0;
scanf("%d%d",&len,&n);
for(int i=0;i<n;i++)
{
int flag;
scanf("%d",&flag);
if(!flag)
{
int temp;
scanf("%d",&temp);
if(temp>pos)
R.push(temp);
else
L.push(temp);
}
else
{
int l=-1000000,r=1000000;
if(L.empty() && R.empty()) continue;
if(!L.empty()) l=L.top();
if(!R.empty()) r=R.top();
if(r-pos<pos-l) dir=1;
else if(pos-l<r-pos) dir=0;
if(dir)
{
ans+=r-pos;
pos=r;
R.pop();
}
else
{
ans+=pos-l;
pos=l;
L.pop();
}
}
}
printf("Case %d: %I64d\n",cas,ans);
}
return 0;
}