题意:
在一条路上 假设小Q一开始在0点,给出道路的长度l和输入的次数k
输入有两种形式:1:0 x 表示在x出掉一块蛋糕
2:1 表示要吃蛋糕 ,每一次要吃时,都找距离最近的有蛋糕的点,若左右距离相等,则按前一次的方向,若左右都没有,则在原地不动
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<set>
using namespace std;
set<int>s;
int num[100010];
int main()
{
int t,l,n,a,b,r,ans,p;
scanf("%d",&t);
int cas=0;
int pos;
while(t--)
{
cas++;
ans=0;
memset(num,0,sizeof(num));
scanf("%d%d",&l,&n);
pos=0;
s.clear();
s.insert(0);
int dir=1;
while(n--)
{
scanf("%d",&a);
if(a==0)
{
scanf("%d",&b);
num[b]++;
s.insert(b);
}
else
{
p=pos;
if(num[pos]){num[pos]--;continue;}
set<int>::iterator it1,it2,it;
it1=it2=s.find(pos);
l=r=-1;
if(it1!=s.begin()) l=*(--it1);
if(++it2!=s.end()) r=*it2;
if(l==-1&&r==-1)continue;
else
{
if(l==-1)
{
dir=1;
ans+=r-pos;
pos=r;
num[r]--;
}
else
{
if(r==-1)
{
dir=0;
ans+=pos-l;
pos=l;
num[l]--;
}
else
{
int dl=pos-l;
int dr=r-pos;
if(dl==dr)
{
if(dir==1)
{
pos=r;
ans+=dr;
num[r]--;
}
else
{
pos=l;
ans+=dl;
num[l]--;
}
}
else
{
if(dl<dr)
{
dir=0;
ans+=dl;
pos=l;
num[l]--;
}
else
{
dir=1;
ans+=dr;
pos=r;
num[r]--;
}
}
}
}
}
s.erase(p);
}
}
printf("Case %d: %d\n",cas,ans);
}
}