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;
}


目录
相关文章
|
2月前
|
存储 缓存 安全
掌握Go语言:Go语言Map,高效键值对集合的应用与注意事项详解(26)
掌握Go语言:Go语言Map,高效键值对集合的应用与注意事项详解(26)
|
2月前
|
人工智能 自然语言处理 Kubernetes
LLM 技术图谱(LLM Tech Map)& Kubernetes (K8s) 与AIGC的结合应用
LLM 技术图谱(LLM Tech Map)& Kubernetes (K8s) 与AIGC的结合应用
171 0
|
2月前
|
存储 缓存 Java
map应用
map应用
29 0
|
8月前
|
Serverless 数据安全/隐私保护 Python
深入探究Python中的map函数及其应用
深入探究Python中的map函数及其应用
|
8月前
|
Python
Python的函数式编程指南:Lambda、Map和Filter的应用
Python是一门多范式的编程语言,允许你以不同的方式编写代码,包括面向对象编程、过程式编程和函数式编程。函数式编程是一种强大的编程范式,它强调不可变性、纯函数和高阶函数的使用。本文将引导你了解Python中函数式编程的一些核心概念和技巧,特别是Lambda、Map和Filter的应用。
Map集合的特点和应用
双列集合,元素由键值对(Entry)构成:key -- value key不可以重复,value可以重复
|
存储 前端开发 API
ES6的Set和Map你都知道吗?一文了解集合和字典在前端中的应用
下面的这篇文章中,将带领大家来一起了解集合和字典在前端中应用,并使用 Map 和 Set 来实现前端的一些常见场景。一起来学习吧~🙋‍♀️
ES6的Set和Map你都知道吗?一文了解集合和字典在前端中的应用
|
存储 自然语言处理 Java
|
Java
Cglib应用:基于Map动态生成JavaBean对象
再某些特殊的场景下,存在手动创建java类的case,比如我有个需求,希望根据简单的Map对象,来生成一个对应的Java bean,可以怎么整? 针对这个而典型的场景,先考虑是否有现成可用的开源工具类来实现,比如我们经常接触到cglib,它可以动态生成代理对象,那么生成Java Bean也没有什么问题 接下来我们看一下使用cglib来创建bean的方式
733 0