The 2019 Asia Yinchuan First Round Online Programming

2019ICPC银川网络赛

题目链接

尽管这场比赛北师可以6分钟AK 但是我队还是第一次做这套题 所以还是认真的打了这场网络赛

A
简单的模拟,开两个栈即可。
因为这道题强制在线,其中有表达式i * ai,所以这里要是不写成 ill 就会爆int。

B
一看计算几何我就逃了。
队友coolwx能过计算几何!
他的办法就是,凸包不转,可以转地面,每转一次其实就是以支点为圆心,支点与目标点之间的距离为半径,对应角的外角为旋转角度做旋转。这样子对每一个顶点都操作一次就可以算出来了。

C
操作encode是把英文字母A-Z平移若干位,要求还原encode之前的编码。
模拟即可。

D
通过一些归纳、推理,很容易猜测(并证明 )第一问的答案是0.5。
(具体说明可以参见下面的那篇博客,对n >= 3情况的考虑与伯努利排的递推证明思想极其类似(毕竟,说到底这题就是一个伯努利排的变体而已))
那么据此,第二问只需要对丢票的一号的登机位置进行枚举并求每一次的概率即可。

类似题目一道:XDOJ 黄海同学的忧郁

H
贪心算法。
在双创周贪心专题里有一道奶牛吃花的题目。当时我觉得非常复杂,暑假自己推了一下i奶牛与j奶牛的优先级的表达式后发现非常简单。
这道题跟奶牛基本一样,根据优先级排序后顺序取下去就可以了。

F
最开始用的一个朴素算法跑到了4000ms,之后dijstra暴力是3000出个头的时间…因为之前跑到了4s所以就以为这是真实的3000出个头,可能可以优化到2999卡过去…搞了半天还是放弃了 (卡不过去)假算法永远都是假算法 还是不要骗自己多吃罚时了。。。
真实的算法是floyd。
我的想法是先把查询离线,然后按照最大容忍的危险程度排序,再通过某种繁琐的办法得知为了要查询某一段询问,需要新增加某些点…这样子不断的双指针在查询中前进并且动态加点…总共的floyd只是跑n3(在我这里k的1-n遍历分开来跑了而已)感觉假是不假,但是特别麻烦。。最后想到这里的时候已经只有20分钟了,一方面马力不足,另一方面估计是来不及写完de完bug…罢了。

看了下面这篇博客我算是明白了…
又是一次行百里者半九十九…
事实上,我的算法中的动态加点是没有必要的。只需要根据每个点的危险程度排序,然后k按照这个顺序遍历就好了。在查询的时候我们查找当前容忍值所能到达的最远k,这样子可以保证之前的k都被floyd筛过,并且也不会算之后的超出最大危险值的点进来。

一些思考
那么现在再从算法设计的状态来看floyd。它其实不同于dijstra,dijstra并没有保存很多的状态,它只保存了最终状态下每个点到单源的最短路,但是floyd不一样。floyd三重数组中k所在的维度其实保存了一整层的状态,处于不同k的所有的最短路都被保存在这个数组中。所以,floyd算法其实暗藏了一种处理动态加点的简便办法!

2019ICPC银川网络赛&2018宁夏邀请赛

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值