阅读739 返回首页    go 阿里云 go 技术社区[云栖]


HDU 4302 MAP应用

题意:有一个动物在一条长为L的直线上,每次吃离他最近的东西,东西不断刷新,它也不短在吃,N次操作,问他走了多少距离,如有前后距离相同按照上一次走的方向吃。

这题队友map过的,我map不熟,写了一下就当熟悉Map了,因为map内部有序,所以查询当前位置最近的两个点(一前一后),再定义一个方向标记就可以了。

#include <iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<map>
using namespace std;
const int oo=1000000;
int main()
{
    map<int,int>mymap;
    int t,l,n,co,a,b,ca=0;
    map<int,int>::iterator it1,it2;
    scanf("%d",&t);
    while(t--)
    {
        mymap.clear();
        mymap[oo]=1,mymap[-oo]=1;
        scanf("%d%d",&l,&n);
        co=0;
        int ans=0,dir;
        while(n--)
        {
            scanf("%d",&a);
            if(a)
            {
                it1=mymap.lower_bound(co);
                if(it1->first==co)
                {
                    it1->second--;
                    if(it1->second==0) mymap.erase(it1);
                }
                else
                {
                    it1--;
                    it2=mymap.upper_bound(co);
                    if(it1->first==-oo&&it2->first==oo) continue;
                    if(co-it1->first==it2->first-co)
                    {
                        if(dir==1)
                        {
                            it2->second--;
                            ans+=it2->first-co;
                            co=it2->first;
                            if(it2->second==0) mymap.erase(it2);
                        }
                        else
                        {
                            it1->second--;
                            ans+=co-it1->first;
                            co=it1->first;
                            if(it1->second==0) mymap.erase(it1);
                        }
                    }
                    else if(it2->first-co<co-it1->first)
                    {
                        dir=1;
                        ans+=it2->first-co;
                        co=it2->first;
                        it2->second--;
                        if(it2->second==0) mymap.erase(it2);
                    }
                    else
                    {
                        dir=0;
                        ans+=co-it1->first;
                        co=it1->first;
                        it1->second--;
                        if(it1->second==0) mymap.erase(it1);
                    }
                }
            }
            else
                scanf("%d",&b),mymap[b]++;
        }
        printf("Case %d: %d\n",++ca,ans);
    }
    return 0;
}


最后更新:2017-04-03 18:52:02

  上一篇:go 怎样通过Parcelable来传递Collection
  下一篇:go 今天,我依然奋战在二级C