• 【CodeForces 83C】 Track


    题目链接

    题目意思很简单,给一个二维迷宫,起点为S,终点为T,其他位置为a-z小写字母,问最多经过k种字母的最短路是多少,输出经过的字母,如果有多种,输出字典序最小的一个。

    因为CF多数都是SPJ,开始没有注意到要最小字典序,以为就是一个简单的搜索,26个字母,只经过k种,很容易想到状态压缩,不过2^26*50*50太大了,开不了数组。看到k<=4就想到枚举字母然后去搜,C(4,26)*50*50,可以接受就开敲了,敲完发现要最小字典序,也没太在意,调整了下搜索顺序就交了,跪在了第13组,看了数据发现还是字典序有问题,平常的题目每步移动的时候添加的字母都是不同的,这样可以每步贪心的得到最小字典序路径,而这题移动的时候会出现相同的字母,这样后面的贪心策略就要根据前面的走法,全部比较太耗时了,自己YY着又调整几次,仍旧跪舔,这才发现字典序才是这题关键~~

    搞了三四个小时,实在搞不出,只好看了大神们的代码,看懂后发现这清一色的A*+暴搜,绝对称得上是暴搜,直接把位置,路径,字符种类,步数,一股脑塞到一个结构体里,搜索的时候以曼哈顿距离为A*函数,按照评估步数最小,其次路径字典序最小出队搜索, 哈希直接用了map。实在太暴力了,还好有一个A*感觉不是在做梦,自己试了下,A*确实相当的给力,去掉A*之后就超时了,加上去跑只要30ms了,然后就感觉这个A*在这里太牛叉了,第一次见到A*有这么大的效力,这题也就放下了。

    昨天又想到这题,感觉有什么不对,A*函数只是调整搜索的顺序,更快的找到解,但是当无解的时候并不会减少搜索的次数,于是构造了下面一组数据:

    50 50 4
    Saaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaae 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaf 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaah 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaai 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaj 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaak 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaal 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaam 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaan 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaao 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaap 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaq 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaas 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaat 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaau 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaav 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaw 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaax 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaay 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaz 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarx 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarxy 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarxyz 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarxyzT 
    

    哈哈,有了这组数据,排在前几的代码几乎全部跪舔。至少都跑了两分钟,看来CF也有数据弱的时候。

    不过这个地方也容易解决,只要提前用一个简单的bfs判断是否存在可行解就行了,不存在解就被kill掉,存在解的用A*快速求出,还是一个不错的解法。

    之后又看了watashi的代码,他的代码虽然不快,跑了1s多,但上面的数据时秒出的,用的是不同的方法,仔细看过之后发现和我最早的想法类似。枚举每k个字母然后暴搜,他把搜索部分和求前驱部分分开来写,一下就清楚了很多,然后一层一层进行排序处理对上一层的路径sort后的id作为下一层排序的依据, 这样到最后就得到了最小字典序, 然后把每次枚举得到的路径取一个最小值即可。

    代码就不贴了。。

  • 相关阅读:
    PyCharm 2018 最新激活方式总结(最新最全最有效)!!!
    Python入门编程中的变量、字符串以及数据类型
    用列主元消去法分别解方程组Ax=b,用MATLAB程序实现(最有效版)
    ISE 14.7安装教程最新版(Win10安装)——解决Win10安装完后打不开快捷方式的方法
    Python零基础入门必知
    Python安装教程最新版
    MATLAB实现连续周期信号的频谱分析(正余弦波信号举例)
    Android 基于帧布局实现一个进度条 FrameLayout+ProgressBar
    Android 使用RadioGroup和RadioButton实现单选效果
    Android 使用CheckBox实现多选效果
  • 原文地址:https://www.cnblogs.com/ambition/p/CF83C.html
Copyright © 2020-2023  润新知