CodeForces 815E Karen and Neighborhood题解
来源:互联网 发布:淘宝买家手机号码采集 编辑:程序博客网 时间:2024/06/05 17:28
题目
题意
有n个房屋一字排开,并从左至右编号为1, 2, …, n。有k个人陆续入住,每个人会挑选无人住的房屋,如果有多间可以选择,那么选择离已有人住的房屋最远的那一间(不是总距离最远哦,如果还有多个选择,选择编号最小的。
第一个人永远会住进第一间,问最后一个人会住进哪间屋子。
题解
显然第2个人会住进最后一间,算是一个特例,在这之后,有人住的屋子会把剩余的分成多个区间,下一个人入住时,会选择一个区间中间的房屋入住。
解这题的时候绕了很多弯路,比如一开始试图找到一个优雅的公式去解题,比如像二分一样,若有a个人要在一个区间里选房子住,第一个一定是住中间,然后区间被分为两个,剩余的人先左边住1个,右边住一个,再左边住两个,右边住两个,再左边住四个……这样就能确定最后一个人会住进哪一边,并且有几个人也选择了那一侧,再缩小范围继续算,结果发现有很多意外情况,加了各种if else
后,才发现这个思路就不对。
后来还是用一个很暴力直接的方法过了这题,而且不慢也不复杂,至少比上面的各种if else
还要优雅:
- 每次入住的时候,假设现在有x个区间,因为想找一个离别人尽量远的,所以一定会选择
(x+1)/2
尽量大的区间(为什么不是x?这是个坑,你想想),如果有多个,就选择编号最小的 - 入住之后,区间会被分成两个(除非原区间长度小于等于2),所以任意时刻,区间的长度最多四种。
- 按照区间的长度归类,每次可以批量让一群人入住到一种长度的区间中,每个区间住一个,这样区间的数量成指数级增长,很快人就都能住完。
- 如果将区间分为左右两种后,再分别按3归类,那么最后就能判断出最后一个人进入了哪边的区间,且还有几个人进入了那边的区间,递归。
阅读全文
0 0
- CodeForces 815E Karen and Neighborhood题解
- Codeforces Round #419 (Div. 2) C. Karen and Game 题解
- Codeforces 816E Karen And SuperMarket 树形背包
- DP训练 Codeforces 816E Karen And SuperMarket [树形DP]
- CodeForces 815D. Karen and Cards
- Codeforces 815B Karen and Test
- Codeforces 815A-Karen and Game
- Codeforces 815B. Karen and Test 【规律】
- Karen and Coffee codeforces
- Karen and Game Codeforces
- Codeforces#419 Karen and Coffee
- CodeForces B. Karen and Coffee
- Codeforces 567E President and Roads 题解
- Codeforces #803E: Roma and Pokers 题解
- Codeforces 815C. Karen and Supermarket 【树形DP】
- Codeforces-815C Karen and Supermarket(树型dp+背包)
- Codeforces Round #419 (Div. 2)-树形dp&依赖背包&-E. Karen and Supermarket
- E. Karen and Supermarket(树形dp)
- jConsole, jVisualvm, btrace 使用体会
- HDU-1688 Sightseeing(最短路+次短路)
- 《图解HTTP》(一)之HTTP基础
- SpringTest框架JUnit单元测试用例获取ApplicationContext实例的方法
- SpringBoot学习(一)SpringBoot基础入门
- CodeForces 815E Karen and Neighborhood题解
- redux(二) 数据流向
- Angular 4.x 修仙之路
- Python——为什么要在意:模块重载
- CodeForces 817E Choosing The Commander题解
- 【经验随笔】 Tomcat多个APP使用相同名称环境变量导致问题
- ThinkPHP 5.0 配置文件
- 调用系统时间
- 【树状数组--求逆序数(离散化)】poj2299 Ultra-QuickSort